指向数组的指针和指向数组第一个元素的指针有什么区别?在大多数情况下,它们是相同的。如果它们不相同,请说明一个例子。谢谢。
答案 0 :(得分:4)
类型不同:
int x[1] = {0};
&x[0]
是指向x
数组的第一个元素的指针,类型为int *
。
&x
是指向x
数组的指针,类型为int (*)[1]
。
但它们的值是相同的,因为数组中没有填充:
(int *) &x == x /* in a value context the expression evaluates to 1 */
答案 1 :(得分:1)
对象的标识由对(地址,类型)给出。只要它们的类型不同,不同的对象可以具有相同的地址,在这种情况下,一个是另一个的子对象。
数组就是这种情况:数组是一个对象,数组元素是对象,数组元素是数组的子对象。第一个元素恰好与数组本身具有相同的地址。结构和第一个结构成员的情况类似。
因此,如果您有一个数组T a[N]
,则a
的类型为T[N]
,a[0]
的类型为T
,因此地址数组是
T (*array_addr)[N] = &a;
并且第一个元素的地址是
T * elem_addr = &a[0];
由于裸数组表达式在某些条件下衰减为指向第一个元素的指针,因此最后一行也可以写为T * elem_addr = a;
,其含义完全相同。
答案 2 :(得分:0)
主要区别在于,当您获得对数组的引用时,它会衰减为指针并且sizeof
不能再使用它来获取数组大小,例如:
int array[10];
printf("%d\n", sizeof(array)/sizeof(array[0]));
printf("%d\n", sizeof(&array)/sizeof(array[0]));
打印在x64上:
10
2
当然,即使您在不使用&
运算符的情况下转换为指针,您也将失去对数组大小的任何引用:
printf("%d\n", sizeof((int*)array)/sizeof(array[0])); // prints 2
答案 3 :(得分:0)
指向数组的指针和指向数组第一个元素的指针表示为q =& a和p = a。当你将p作为p ++递增时,它将指向数组中的下一个元素,但是当你递增q ++时,它将为该数组中的最后一个元素提供下一个位置。因此,指向数组的指针表示整个数组,而指向数组中第一个元素的指针仅表示数组中的第一个元素。
答案 4 :(得分:0)
你可以打印a和& a,而不是打印a ++和& a ++。通过结果,您将知道答案,尝试一下。 a表示元素地址,& a表示数组地址。 int a [] = {1,2};