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

时间:2011-10-11 11:04:19

标签: c pointers

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

2 个答案:

答案 0 :(得分:2)

在C中,指针和数组非常相似。在您的示例中,ap之间的唯一区别是sizeof a4 * (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;

注意,对于数组(在大多数情况下),比如数组aADDRESS_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.