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

时间:2014-06-05 09:07:31

标签: c arrays pointers

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

    #include <stdio.h>
    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. 为什么&size;(text)&#39; sizeof(text)&#39;是7而大小是(文字+ 2)&#39;是4
  2. &#39; text&#39;之间的区别是什么?和&#39;&amp; text&#39;?

2 个答案:

答案 0 :(得分:1)

text+2

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

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

答案 1 :(得分:1)

重要:数组不是指针

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

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

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

所以text+1&text+1之间的差异也应该很明显。第一个将char指针递增一个元素 - &gt;指出第一个元素背后的一个元素。第二个指向第一个后面的第二个7元素字符数组。