2014-11-04 79 views
1

我正在學習C中的數組中的指針。我真的很困惑,指針的數組究竟是什麼。看看此例 -爲什麼p不顯示與a相同的地址?

#include<stdio.h> 
int main() 
{ 
    static int a[] = { 0, 1, 2, 3, 4 }; 
    int *p[] = { a, a+1, a+2, a+3, a+4 }; 

    printf("%p %p %p %d ", p, *p, a, *(*p)); 
    return 0; 
} 

當我運行這個程序,我得到不同的地址ap。爲什麼?據我所知,a是指向數組的第零個元素的指針,而p是指向指針的指針。 a指向第零個元素的地址,但p呢?有沒有地址的地址?

+1

a不是指針,a是數組。 p也不是一個指針,它也是一個數組。 – 2014-11-04 17:36:09

+0

@MooingDuck儘管 – 2014-11-04 20:19:50

回答

0

p指向的存儲器包含塊的第一位置:

{ a,a+1,a+2,a+3,a+4 } 

一個的存儲器包含塊的第一位置

{0,1,2,3,4} 

這兩個因此指向不同的內存塊。

P [0](或* P)和一個應具有相同的地址。

+0

有可能存在地址的地址,但它們都衰減到指向'printf'語句的指針? – 2014-11-04 16:08:33

+1

@LishaGuPta你需要在某處存儲內存地址。你在哪裏存儲它? – Degustaf 2014-11-04 16:22:57

+0

如果它的合法性比&& a = 2也應該合法 – 2014-11-04 16:28:38

0

試想事情存儲器被組織:

一個:含有5點的整數0至4的連續存儲區包括 - 一個是一個數組,&a == &(a[0])(並且也是一樣a

p爲指針爲int的數組:它依次含有5個指針的連續存儲區。 p是一個數組,如p == &(p[0])。但是現在p[0]是一個包含地址a的指針。

所以p是包含的a的地址的存儲區的地址:它實際上是一個地址

的所以當然地址:*p(或p[0])是一樣的a**pa[0]。但對於任何數組p一樣p[0]

+1

Nitpick:'p'(通常)被轉換爲指向其第一個元素的指針,從而產生指向包含**一個**指針的內存區域的指針。 **然而**,'&p'是不同的。它產生一個指向包含**五個**指針的內存區域的指針。 「p」和「&p」的類型不一樣。 – 2014-11-04 16:54:15

+0

@NisseEngström:你是真的。它們具有相同的價值,但不代表相同的類型。 – 2014-11-04 17:31:47

1

的地址由位,並取得位的任何東西都可以放在內存中。記憶中的一切都有一個地址。

這並不意味着程序中的每個地址值在內存中都是。地址也可以是用作表達式一部分的臨時值。

這同樣適用於整數值。其中有些是在記憶中,有些則不是。你可以有這樣的:

int i = 7; 
int *p = &i; 

,但你不能有這樣的:

int *q = &7; 

i是一個變量存在於記憶的名稱,你可以用&得到它的地址。值7存儲在該地址。 &7不起作用,因爲程序源代碼中文字7的存在不足以導致運行時在存儲器中存在值7。

在略多的技術術語,i左值7右值。前綴&運算符要求其操作數爲左值,但不會生成左值結果。 &i是一個右值,就像7。這就是爲什麼&(&i)無效。

+0

Thankyou很棒! :)只要我underatand由你回答是&(&a)= 2是非法的,因爲&a畢竟是一個十六進制整數,我們可以使用&與任何整數,因此它是非法的。 – 2014-11-04 17:25:29

1

將變量看作地址的別名。當你有

int v1 = 10; 

v1是用於保存10地址的別名。

當你有:

int* v2 = &v1; 

v2是用於保存的v1地址的地址的別名。

的地址可以認爲,也可以是其他地址或原始數值,例如int S,char S等

要回答你的問題的值,

有沒有像地址的地址什麼?

嚴格地說,答案是否定的。但是,如果您有:

int** v3 = &v2; 

然後,v3是有其具有具有int作爲其值的地址值的地址值的地址別名。

在你的情況,

static int a[] = { 0, 1, 2, 3, 4 }; 
int *p[] = { a, a+1, a+2, a+3, a+4 }; 

a是一個數組,的int秒的陣列。在表達式中使用時,它將衰減爲一個指針。 a,a+1等評估爲指向int s。

p也是一個數組,數組爲int* s。在表達式中使用時,它將衰減爲一個指針。 p,p+1等評估爲指向int*s的指針。

p評估的地址爲int*-a
a評估的地址爲int - 0

*p評估爲a
*a評估爲0

1

沒有兩個變量可以在C.

陣列a和陣列p是變量具有相同的地址。所以他們必須有不同的地址。

下面是另一個例子:

int x[3] = { 0, 1, 2 } ; 
int y[3] = { 0, 1, 2 }; 

printf("%p %p\n", &x , &y); 

這都沒有區別,在您的示例中的數組存儲不同的數據類型比int

此外,數組的第一個元素始終駐留在陣列的開始,所以輸出x(其衰減到&x[0]當您嘗試打印它的值)將得到相同的結果&x

相關問題