如果我有一个 int 数组intArr[4]并得到它指向的地址,如下所示printf("%pn", intArr,);
然后获取数组的地址printf(“%pn”, &intArr);
两个语句返回相同的地址
0xffffcc14
0xffffcc14
然后,当它通过intArr[0]或 *intArr取消引用时,它会给出一个整数值。
所以我想知道发生了什么,使数组看起来好像在同一内存位置同时保存两个东西:指向自身的指针值和元素值?
您声明的数组
intArr[4];
实际上是一个命名的内存范围。因此,数组的地址及其第一个元素的地址是数组占用的内存范围的地址。
printf
调用中使用的表达式&intArr
和intArr
之间的唯一区别是它们的类型。第一个表达式的指针类型int ( * )[4]
,第二个表达式的指针类型int *
但表达式生成的值彼此相等。
在此通话中
printf("%pn", intArr,);
数组指示符隐式转换为指向其第一个元素的指针。
表达式中使用的数组(例如在sizeof
运算符中使用它们)的表达式中会隐式转换为指向其第一个元素的指针。
例如,如果你会写
printf( "%zun", sizeof( intArr ) );
您将获得数组的大小。
另一方面,如果你会写
printf( "%zun", sizeof( intArr + 0 ) );
您将获得指针的大小,因为在此表达式中intArr + 0
数组指示符隐式转换为指向其第一个元素的指针。
至于这些表达式intArr[0]
和*intArr
,则第一个表达式的计算方式与*intArr
相同*( intArr + 0 )
。