指针 – 数组和指针之间的区别

a,&a,第一个元素a [0]的地址有什么区别? 类似地,p是指向整数但指定为数组地址的指针。 指针[]是否会执行指针运算并根据数据类型获取值? *期望什么价值? 它应该是指针吗?

#include int main() { int a[]={5,6,7,8}; int *p= a; printf("\nThis is the address of a %u, value of &a %u ,Address of first element %u , Value pointed by a %u",a,&a,&a[0],*a); printf("\nThis is the address at p %u , value at p %u and the value pointed by p %d",&p,p,*p); printf("\n"); } This is the address of a 3219815716, value of &a 3219815716 ,Address of first element 3219815716 , Value pointed by a 5 This is the address at p 3219815712 , value at p 3219815716 and the value pointed by p 5 

 int a[]={5,6,7,8}; int *p= a; 

请注意,对于数组(在大多数情况下),例如数组aADDRESS_OF a与数组a ADDRESS_OF第一个元素相同.ADDRESS_OF ADDRESS_OF(a)ADDRESS_OF(a[0])&ADDRESS_OF运算符,因此在数组a情况下, &a&a[0]都是相同的。

我已经强调过,在大多数情况下,数组的名称将转换为其第一个元素的地址; 一个值得注意的例外是当它是sizeof的操作数时,如果与malloc有关的东西是可行的,这是必不可少的。 另一种情况是数组名称是&address-of运算符的操作数。 在这里,它被转换为整个数组地址 。 有什么不同? 即使您认为地址在某种程度上“相同”,但关键的区别在于它们具有不同的类型。 对于类型为T的n个元素的数组,则第一个元素的地址具有“指向T”的类型; 整个数组的地址类型为’指向类型为T的n个元素的数组的指针’; 显然非常不同。

这是一个例子:

 int ar[10]; int *ip; int (*ar10i)[10]; /* pointer to array of 10 ints */ ip = ar; /* address of first element */ ip = &ar[0]; /* address of first element */ ar10i = &ar; /* address of whole array */ 

有关更多信息,请参阅The C Book。

在C中,指针和数组非常相似。 在您的示例中, ap之间的唯一区别是sizeof a4 * (sizeof int)sizeof p是指针的大小,可能是4或8,具体取决于您的平台。 除此之外,C并没有真正区分指针和数组。 所以a [0],* a,p [0]和* p都是相同的。 在某些情况下,即使0 [p]也是有效的。 它只是使指针算术。