数组和指针

Array and pointers

本文关键字:指针 数组      更新时间:2023-10-16
int array[10] = {1,2,3,4,5,6,7,8};
int *ptr = array;
std::cout<<*(ptr+ 2); => O/P = 3
int (*arr_ptr)[10] = &array;
std::cout<<*(*arr_ptr+2); => O/P = 3

这两个有什么不同?我知道它们的意思,但如果它们给出相同的结果为什么我们有两种不同的符号?

第一种情况是正常情况:ptr是指向数组array的第一个元素的指针,并且它被索引(使用*(ptr+2),它是ptr[2]的同义词)访问该数组的第三个元素。

第二种情况是人为的:arr_ptr是指向(整体)数组array的指针。首先对其解引用(使用*arr_ptr)以生成数组本身,然后将其用作二进制+的参数,这导致它被隐式转换为指向其第一个元素的(无名)指针,然后以相同的方式对*(<nameless pointer>+2)进行索引,并给出相同的结果。

使这些隐式转换显式,您可以写

int *ptr = &array[0];
std::cout<<*(ptr+ 2);
int (*arr_ptr)[10] = &array;
std::cout<<*( &(*arr_ptr)[0] + 2 );

修改你的问题后,以下是不同之处:

(1) int *ptr = array;

array被衰减到指针。理想情况下,允许ptr指向任何int[],而不考虑其大小

(2) int (*arr_ptr)[10] = &array;

arr_ptr是指向int[10]的指针。这是一个非常具体的定义,你永远不能给arr_ptr分配一个大小与10不同的数组。

int array_2[20];
arr_ptr = &array_2; // error

使用您理解并且适合问题域的符号。如果你的应用有一个数组,那么使用数组表示法。如果由于其他原因需要对指针进行push操作,那么第二个版本比较合适。

对于编译器来说,它们实际上是不一样的,并且会导致生成不同的汇编语言。

这里有一些关于差异的很好的参考:http://cplusplus.com/forum/articles/10/