访问列表项的内存地址的操作顺序?

时间:2018-08-26 00:13:00

标签: c

假设我有一个非常基本的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”的内存地址实际上没有任何意义。

2 个答案:

答案 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));

在两行上您将看到相同的地址。