2011-04-12 80 views
0

指針與數組衝突

int*p ,b = 5; 
p = &b; 

表示一個維數組,那麼什麼是輸出由下面的語句

printf("%d",p); 

是它的一個地址給?如果它是一個地址,那麼告訴我它屬於哪個元素,請詳細解釋

+0

這裏沒有陣列。 – 2011-04-12 16:45:32

+0

這些不是您正在尋找的陣列? – MJB 2011-04-12 16:54:01

+0

@JAMES @ MJB在數組的情況下,數組的名字將會給我第一個元素的地址,然後如果是指針,它將會使我反彈的東西,即語句printf(「%d」 ,p); – nobalG 2011-04-12 16:59:27

回答

1
p = &b 

表示陣列!正如我解釋here,他們不是一回事。 b只是一個整數值。如果您聲明bint b[] = {1, 2, 3};那麼p將指向b的第一個元素。

printf("%d",p); 

這將打印p的值,並且由於p是一個指針和指向b,這將打印b的地址。 printf("%d", &b);會給出相同的結果。
順便說一句,如果b是一個數組,b[5]將被翻譯成*(p + 5),所以你可以通過在數組的開頭添加元素的數量來讀取(和寫入)值。和b[5] == p[5] == *(b + 5) == *(p + 5) !!!但不是因爲數組和指針是同一件事,只是因爲數組的名字轉化爲它的第一個元素的地址。
作爲一個方面說明,編譯器在編譯爲程序集時總是使用指針表示法(*(base + offset))。

+0

是的,我知道了,thankeww – nobalG 2011-04-12 17:10:03

+0

你能告訴我,我們只能使用%u打印元素的地址,或者%d,%f ,,,可以在各種編譯器中正常工作 – nobalG 2011-04-12 17:13:31

+0

@Alfred Nobel :你應該使用打印指針值的%p – BlackBear 2011-04-12 17:16:24

-1

該數組的第一個元素的地址。 (如果B爲一個數組) 使用的p ++通過陣列滾動

+0

'p ++'不會幫助您滾動數組,它只會將指針的值增加1(與增加整數的方式大致相同)。您應該使用'[]'運算符來訪問數組的元素。 – 2011-04-12 16:58:23

+0

我的意思是p ++會給你下一個數組元素的地址。 – anon 2011-04-12 18:00:25

0

指針而不是表示一維數組。它只是一個指向整數的指針。它可能指向數組的第一個元素,例如當你做int* p = new int[6]時,但這是完全不同的;在這種情況下,您將爲六個整數的新數組分配空間,並將第一個數組的地址(或數組的開頭)存儲在p中。

如果您打印p它將打印它存儲的內存地址。如果p「表示數組」(強調引號),那麼您將打印該數組的第一個元素的地址。

0
int*p ,b = 5; 
p = &b; 

是完全等效於:

int b = 5; 
int *p = &b; 

p最終被以int的指針。現在,它真的什麼P中結束了這段代碼會產生多大的影響相同(雖然B有一個完全不同的類型和值),因爲這:

int b[1] = {5}; 
int *p = b; // or int *p = &b[0]; 
在這兩種情況下p指向

肯定是一個int您可以視爲一個簡單的int,或者作爲大小爲1的一維數組中的第一個(也是唯一)元素。那麼,接踵而來的是合法的,並給出在這兩種情況下有意義的結果:

printf("%d is stored at %p\n", *p, p); 
printf("%d\n",p[0]); 

但是這幾乎是其中的相似之處。