如果有人定义了一个数组,例如“ int array[5] ”,“ array ”或“ &array ”的含义是什么?它们是相同的还是不同的?您可能会认为它们都指向数组的第一个元素,即它们都有相同的地址。让我们一探究竟!
要检查这一点,首先想到的是以下程序。
#include "stdio.h"
int main()
{
int array[5];
/* If %p is new to you, you can use %d as well */
printf("array=%p : &array=%p\n", array, &array);
return 0;
}
所以你得到了相同的“ array ”和“ &array ”地址。同样,您很容易认为两者是相同的。好吧,他们不是!为什么一个变量和它的 &(即地址)是一样的。这看起来不合逻辑,但我们看到“ array ”和“ &array ”都打印了相同的地址。可能现在下结论还为时过早。这篇文章的关键是,即使它们都产生相同的地址,但它们是不同类型的地址。这就是“ array ”和“ &array ”之间的区别。
为了显示这种差异,我建议查看以下程序。
#include "stdio.h"
int main()
{
int array[5];
/* If %p is new to you, you can use %d as well */
printf("array=%p : &array=%p\n", array, &array);
printf("array+1 = %p : &array + 1 = %p", array+1, &array+1);
return 0;
}
通过指针算术,我们知道将整数加到指针时会发生什么。那么你能在不运行的情况下猜出上面程序的输出吗?不应该“ array+1 ”和“ &array+1 ”指向相同的地址。好吧,你可能会感到惊讶🙂
基本上,“ array ”是“指向数组第一个元素的指针”,而“ &array ”是“指向整个 5 int 数组的指针”。由于“ array ”是指向int 的指针,因此加 1 导致地址增量为 4(假设您的机器中的 int大小为 4 个字节)。由于“ &array ”是指向 5 个整数数组的指针,因此加 1 导致地址增量为 4 x 5 = 20 = 0x14。现在你明白了为什么这两个看似相似的指针在核心层面上是不同的。这个逻辑也可以扩展到多维数组。假设double twoDarray[5][4]是一个二维数组。这里,“twoDarray”是一个指向 4 个 int 数组的指针,而“&twoDarray”是一个指向 4 个 int 数组的 5 行数组的指针。如果这听起来很神秘,你总是可以在添加 1 后使用一个小程序来打印这些。我们希望我们可以澄清任何数组名称本身都是指向第一个元素的指针,但数组名称的 &(即 address-of)是指向整个数组本身的指针。
如果您觉得以上有用,请点赞/推特/G+1。另外,请给我们留言以获得进一步的说明或信息。我们很乐意帮助和学习🙂