c中x与&x的区别

时间:2013-12-27 12:45:26

标签: c pointers

指向数组的指针和指向数组第一个元素的指针有什么区别?在大多数情况下,它们是相同的。如果它们不相同,请说明一个例子。谢谢。

5 个答案:

答案 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};