应该何时将数组名称视为指针,何时它只表示数组本身?

我刚读完这本书后做了一个测试程序,结果令人困惑:

#include  int main(void) { char text[] = "hello!"; printf("sizeof(text):%d sizeof(text+2):%d sizeof(text[0]):%d \n",(int)sizeof(text), sizeof(text+2), sizeof(text[0])); printf("text:%p sizeof(text):%d &text:%p sizeof(&text):%d \n",text, sizeof(text), &text, sizeof(&text)); printf("text+1:%p &text+1:%p \n", text+1, &text+1); return 0; } 

结果:

 sizeof(text):7 sizeof(text+2):4 sizeof(text[0]):1 text:0xbfc8769d sizeof(text):7 &text:0xbfc8769d sizeof(&text):4 text+1:0xbfc8769e &text+1:0xbfc876a4 

让我感到困惑的是:

  1. 为什么’sizeof(text)’的值是7而’sizeof(text + 2)’的值是4
  2. ‘text’和’&text’之间有什么区别?

 text+2 

是指向数组中第3个元素的指针,因此sizeof会导致指针的大小

text是数组,而text是指向数组的指针text [1]是数组中的第二个元素,但是(&text)[1]指向数组后面的第一个元素(在这种情况下等于&text [7])

重要提示:数组不是指针

如果在期望指针的上下文中使用它们,它们会降级为指针。

  • sizeof(text)将数组放在一个整体上,输出7;
  • sizeof(text+2)指针算术让数组降级为指针
  • sizeof(text[0])当然是一个元素的大小
  • sizeof(&text)指向数组的指针的大小。 显然也是指针

在数组上使用地址操作显式地检索指向该特定类型的数组的指针(在您的情况下为char[7] 。该指针具有相同的地址,但与to-pointer-degraded数组的类型不同)。

所以text+1&text+1之间的区别也应该是显而易见的。 第一个将char指针递增一个元素 – >指向第一个元素后面的一个元素。 第二个指向第一个后面的第二个7元素字符数组。