数组/ arrayname不是指向C中第一个元素的指针吗?

时间:2009-12-04 08:20:45

标签: c arrays pointers

下面的内容是不是arrayname总是指向C中第一个元素的指针?

int myArray[10] = {0};

printf("%d\n", &myArray); /* prints memadress for first element */
printf("%d\n", myArray); /* this prints a memadress too, shows that the name is a pointer */

printf("%d\n",sizeof(myArray)); /* this prints size of the whole array, not a pointer anymore? */
printf("%d\n",sizeof(&myArray)); /* this prints the size of the pointer */

7 个答案:

答案 0 :(得分:18)

数组名称是数组名称。数组名称是标识整个数组对象的标识符。它不是指向任何东西的指针。

当在表达式中使用数组名称时,数组类型会自动隐式转换为几乎所有上下文中的指针到元素类型(这通常称为“数组类型衰减”)。结果指针是一个完全独立的临时右值。它与数组本身无关。它与数组名称无关。

未进行隐式转换时的两个例外是:operator sizeof和一元运算符&(address-of)。这正是您在代码中测试的内容。

答案 1 :(得分:5)

警惕类型。

  • myArray的类型为int[10]
  • &myArray的类型为int (*)[10](指向int[10])。
  • 评估时,myArray的类型为int *。即myArray的类型为int *
  • sizeof不评估其参数。因此sizeof(myArray) == sizeof(int[10]) != sizeof(int *)

推论:

  • myArray&myArray是不兼容的指针类型,不可互换。

您无法正确地将&myArray分配给int *foo类型的变量。

答案 2 :(得分:4)

数组不是指针。但是,如果在表达式中使用数组名称,而不是&运算符或sizeof运算符的主题,则它将计算为指向其第一个元素的指针。

答案 3 :(得分:3)

不,数组第一个元素(和其余元素)。在将它作为参数传递给函数之前,它不会转换为指针。

答案 4 :(得分:1)

arrayname将指向数组的所有元素。这就是你能做到的原因 (arrayname + 5)指向数组中的第5个元素。

答案 5 :(得分:0)

arrayname不是指针,但它可以被视为指向数组第一个元素的指针。

答案 6 :(得分:0)

做arrayname ++,你会知道arrayname一次代表整个数组而不仅仅是起始元素....默认情况下它保留了第一个元素的起始地址