2011-10-11 143 views
3

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

#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

READ C-FAQ专门部6问:6.12 [链接](HTTP:// C -faq.com/aryptr/index.html) –

+1

http://stackoverflow.com/questions/26149426/how-can-an-address-have-multiple-values阅读这个问题的答案... – Hari

回答

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

注意,在阵列(在大多数情况下)的情况下,说阵列a,所述ADDRESS_OFa是相同array.ie的ADDRESS_OF第一元件,ADDRESS_OF(a)是相同ADDRESS_OF(a[0])&ADDRESS_OF算子,因此在数组a,&a&a[0]都是相同的情况下。

我已经强调过,在大多数情况下,数组的名称被转换为其第一个元素的地址;一个值得注意的例外是当它是sizeof的操作数时,这对于malloc所做的工作是必不可少的。另一种情况是当数组名称是地址运算符的操作数时。在这里,它被转换成整个阵列的地址。有什么不同?即使你认为地址会以某种方式“相同”,但关键的区别在于它们有不同的类型。对于类型为T的n个元素的数组,则第一个元素的地址具有类型'指向T'的指针;整个数组的地址的类型为“指向T类型的n个元素的数组的指针”;显然非常不同。

下面是它的一个例子:和6.13这里

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.

+0

Sanjay,one我不明白的一点是 - “即使你认为地址在某种程度上是'相同的',关键的区别在于它们有不同的类型”所以&ar会编译成一个地址o f完整数组 - 当内存以4/8字节存储时,最终只是一个4/8字节的整数。数组大小的额外信息存储在哪里/哪里? '类型'是否意味着编译器解释变量的方式会有所不同?特别是算术? – Nishant

2

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