C:应用于数组vs指针的&号运算符

cxfofazt  于 2023-04-05  发布在  其他
关注(0)|答案(3)|浏览(103)

假设我们有

int foo[4] = {1, 2, 3, 4};

foo将是指向数组第一个元素的指针。我们可以这样做:

printf("%p", foo); // OUTPUT is some address 0xffffcc00

现在如果我们这样做:

printf("%p", &foo); // OUTPUT is the same address 0xffffcc00

在网上,我看到&<array-name>的这种特殊语法获取整个数组的地址。这解释了上面两个相同的值,因为起始元素的地址与整个数组的地址相同。
但是一般来说,我的理解是&应该获取其右边的任何地址。(即在这种情况下,它“应该”获取指向数组第一个元素的指针的地址。)
那么为什么&foo不取指针foo的地址呢?如果这是C语言的一个异常,这是唯一的异常吗?还是还有其他类似的情况?

nx7onnlm

nx7onnlm1#

有一个常见的误解,认为指针和数组是一回事。它们不是 *,但它们是相关的。
您的第一个示例工作正常:

printf("%p", foo);

因为在大多数情况下,数组衰减为指向数组第一个元素的指针。
一种情况是当一个数组是地址运算符&的操作数时,这给出了整个数组的地址,而不仅仅是第一个元素的地址(即使值是相同的)。
详细信息见C standard的第6.3.2.1p3节:
除非它是sizeof运算符、_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,具有类型“type 的数组”的表达式被转换为具有类型“指向 type 的指针”的表达式,该表达式指向数组对象的初始元素并且不是左值。如果数组对象具有寄存器存储类,则行为未定义。

xxls0lw8

xxls0lw82#

基本上,指针用于以另一种轻松的方式访问数组元素。在低级编程中,每个变量都有一个在内存中分配的地址。顺便说一句,数组也是一个变量名,就像标量变量一样。
与标量变量不同,数组变量有一些东西。

  • 在后续内存地址中分配的元素列表(序列)。
  • 所以我们可以通过使用第一个元素地址来获得所有元素

FYI,Array Name ==第一个元素的地址==数组的地址
(foo== &foo == &foo[0])
因此,当你试图通过使用 foo这个符号来获取元素时,最初它指向**(&foo + 0)**,因此基于第i个值,你可以逐个访问所有元素。希望这个答案会有所帮助。:)

ecbunoof

ecbunoof3#

我更喜欢使用this explanation关于'&基本上意味着“地址的操作符”'论文。所以,数组不是指针!但是数组可以自动“衰减”为指针。进入&foo[0],但是&foo是一个指向四个整数的数组的指针,因为它的类型。要获得PoC,您需要检查GDB下的ptype fooptype &foo

相关问题