a
,&a
与第一个元素a[0]
的地址有何区别?类似地,p
是指向分配了数组地址的整数的指针。
请pointer[]
执行指针算术并根据数据类型获取值吗? *
期望的值是多少?它应该是指针吗?
#include<stdio.h>
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
答案 0 :(得分:2)
在C中,指针和数组非常相似。在您的示例中,a
和p
之间的唯一区别是sizeof a
是4 * (sizeof int)
而sizeof p
是指针的大小,可能是4或8,具体取决于你的平台。除此之外,C并没有真正区分指针和数组。所以a [0],* a,p [0]和* p都是相同的。在某些情况下,即使0 [p]也是有效的。它只是使指针算术。
答案 1 :(得分:2)
int a[]={5,6,7,8};
int *p= a;
注意,对于数组(在大多数情况下),比如数组a
,ADDRESS_OF
a
与array.ie的第一个元素ADDRESS_OF
相同, ADDRESS_OF(a)
与ADDRESS_OF(a[0])
相同。 &
是ADDRESS_OF
运算符,因此在数组a
的情况下,&a
和&a[0]
都是相同的。
我已经强调过,在大多数情况下,数组的名称将转换为其第一个元素的地址;一个值得注意的例外是当它是sizeof的操作数时,如果与malloc有关的东西是可行的,这是必不可少的。另一种情况是数组名称是&amp;的操作数。运营商地址。在这里,它被转换为整个数组的地址。有什么不同?即使您认为地址在某种程度上“相同”,但关键的区别在于它们具有不同的类型。对于类型为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.