c语言 - 数组在内存中的同一位置保存指针值和元素值的显示方式如何?



如果我有一个 int 数组intArr[4]并得到它指向的地址,如下所示printf("%pn", intArr,);

然后获取数组的地址printf(“%pn”, &intArr);

两个语句返回相同的地址

0xffffcc14

0xffffcc14

然后,当它通过intArr[0]或 *intArr取消引用时,它会给出一个整数值。

所以我想知道发生了什么,使数组看起来好像在同一内存位置同时保存两个东西:指向自身的指针值和元素值?

您声明的数组

intArr[4];

实际上是一个命名的内存范围。因此,数组的地址及其第一个元素的地址是数组占用的内存范围的地址。

printf调用中使用的表达式&intArrintArr之间的唯一区别是它们的类型。第一个表达式的指针类型int ( * )[4],第二个表达式的指针类型int *但表达式生成的值彼此相等。

在此通话中

printf("%pn", intArr,);

数组指示符隐式转换为指向其第一个元素的指针。

表达式中使用的数组(例如在sizeof运算符中使用它们)的表达式中会隐式转换为指向其第一个元素的指针。

例如,如果你会写

printf( "%zun", sizeof( intArr ) );

您将获得数组的大小。

另一方面,如果你会写

printf( "%zun", sizeof( intArr + 0 ) );

您将获得指针的大小,因为在此表达式中intArr + 0数组指示符隐式转换为指向其第一个元素的指针。

至于这些表达式intArr[0]*intArr,则第一个表达式的计算方式与*intArr相同*( intArr + 0 )

最新更新