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

下面的内容是不是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 */ 

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

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

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

警惕类型。

  • 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类型的变量。

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

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

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

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

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