2011-10-11 144 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]也是有效的。它只是使指針算術。