数组如何将指针值和元素值保存在内存中的同一位置?
How does an array appear to hold a pointer value and an element value at the same location in memory?
如果我有一个 int 数组 intArr[4] 并像这样获取它指向的地址
printf("%p\n", intArr,);
然后获取数组的地址
printf(“%p\n”, &intArr);
两条语句return同一个地址
0xffffcc14
0xffffcc14
然后当通过 intArr[0] 或 *intArr 取消引用时,它给出一个整数值。
所以我想知道发生了什么,使数组看起来好像在同一内存位置同时保存两个东西:一个指向自身的指针值和一个元素值?
你声明的数组
intArr[4];
实际上是一个命名的内存范围。所以数组的地址和它的第一个元素的地址就是数组占用的内存范围的地址。
在 printf
的调用中使用的表达式 &intArr
和 intArr
之间的唯一区别是它们的类型。第一个表达式的指针类型为 int ( * )[4]
,第二个表达式的指针类型为 int *
,但表达式产生的值彼此相等。
在本次通话中
printf("%p\n", intArr,);
数组指示符被隐式转换为指向其第一个元素的指针。
在表达式中使用的数组,很少有例外,例如在 sizeof
运算符中使用它们,它们被隐式转换为指向其第一个元素的指针。
例如,如果你会写
printf( "%zu\n", sizeof( intArr ) );
你会得到数组的大小。
另一方面,如果你会写
printf( "%zu\n", sizeof( intArr + 0 ) );
您将获得指针的大小,因为在此表达式中 intArr + 0
数组指示符被隐式转换为指向其第一个元素的指针。
至于这些表达式 intArr[0]
和 *intArr
然后第一个表达式被评估为 *( intArr + 0 )
与 *intArr
.
相同
如果我有一个 int 数组 intArr[4] 并像这样获取它指向的地址
printf("%p\n", intArr,);
然后获取数组的地址
printf(“%p\n”, &intArr);
两条语句return同一个地址
0xffffcc14
0xffffcc14
然后当通过 intArr[0] 或 *intArr 取消引用时,它给出一个整数值。
所以我想知道发生了什么,使数组看起来好像在同一内存位置同时保存两个东西:一个指向自身的指针值和一个元素值?
你声明的数组
intArr[4];
实际上是一个命名的内存范围。所以数组的地址和它的第一个元素的地址就是数组占用的内存范围的地址。
在 printf
的调用中使用的表达式 &intArr
和 intArr
之间的唯一区别是它们的类型。第一个表达式的指针类型为 int ( * )[4]
,第二个表达式的指针类型为 int *
,但表达式产生的值彼此相等。
在本次通话中
printf("%p\n", intArr,);
数组指示符被隐式转换为指向其第一个元素的指针。
在表达式中使用的数组,很少有例外,例如在 sizeof
运算符中使用它们,它们被隐式转换为指向其第一个元素的指针。
例如,如果你会写
printf( "%zu\n", sizeof( intArr ) );
你会得到数组的大小。
另一方面,如果你会写
printf( "%zu\n", sizeof( intArr + 0 ) );
您将获得指针的大小,因为在此表达式中 intArr + 0
数组指示符被隐式转换为指向其第一个元素的指针。
至于这些表达式 intArr[0]
和 *intArr
然后第一个表达式被评估为 *( intArr + 0 )
与 *intArr
.