假设我有一个非常基本的C代码,它只是简单地打印了列表内某个元素的内存地址,例如
#include <stdio.h>
int main()
{
int data[5] = {1,2,3,4,5};
printf("%x", &data[2]);
return 0;
}
&data[2]
呼叫的操作顺序是什么?
我发现很难用视觉看到它,因为data[2]
返回一个数字,而获取数字“ 3”的内存地址实际上没有任何意义。
答案 0 :(得分:3)
创建数组时,编译器将为其保留内存,并且您可以将值存储在该内存中。
例如,返回什么&data[2]
不是指向整数3
的指针,而是指向您选择存储整数值3
的数组元素的指针。
像您这样的数组在内存中看起来像这样
+---------+---------+---------+---------+---------+ | data[0] | data[1] | data[2] | data[3] | data[4] | +---------+---------+---------+---------+---------+
如果您想要的只是指向某个元素的指针,则存储在每个元素中的确切值是无关紧要的。
答案 1 :(得分:2)
在C语言中,语法array[index]
只是*(array + index)
的语法糖,并且运算符&array[index]
的地址可以重写为(array + index)
,这就是您所要的内容。使用语句&data[2]
获取地址。您没有在data[2]
(即3)获得值的地址;您将获得(data + 2)
的地址。
尝试一下:
int data[5] = {1,2,3,4,5};
printf("%p\n", (void *)&data[2]);
printf("%p\n", (void *)(data + 2));
在两行上您将看到相同的地址。