数组/ 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一次代表整个数组而不仅仅是起始元素….默认情况下它保留了第一个元素的起始地址