下面的内容是不是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 */
答案 0 :(得分:18)
数组名称是数组名称。数组名称是标识整个数组对象的标识符。它不是指向任何东西的指针。
当在表达式中使用数组名称时,数组类型会自动隐式转换为几乎所有上下文中的指针到元素类型(这通常称为“数组类型衰减”)。结果指针是一个完全独立的临时右值。它与数组本身无关。它与数组名称无关。
未进行隐式转换时的两个例外是:operator sizeof
和一元运算符&
(address-of)。这正是您在代码中测试的内容。
答案 1 :(得分:5)
警惕类型。
myArray
的类型为int[10]
。&myArray
的类型为int (*)[10]
(指向int[10]
)。myArray
的类型为int *
。即myArray
的值的类型为int *
。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一次代表整个数组而不仅仅是起始元素....默认情况下它保留了第一个元素的起始地址