2011-05-10 16 views
13
int my_array[5] = {0}; 
int *my_pointer = 0; 

my_pointer = &my_array // compiler error 
my_pointer = my_array // ok 

如果my_array是數組的地址那麼&my_array給了我什麼?爲什麼將一個數組的地址賦給一個指針「my_pointer =&my_array」會出現編譯錯誤?

+2

'&array'的含義也在[這裏](http://stackoverflow.com/questions/4810664/)討論。 – fredoverflow 2011-05-10 21:25:19

+0

@FredOverflow:不是我能找到它的地方!請給我們一個指針(當然不是數組)。 – TonyK 2011-05-10 21:46:44

+1

@Tony:下面的「藝術不是指針」的ASCII藝術解釋它。 – fredoverflow 2011-05-11 11:23:22

回答

26

my_array是5個整數的數組的名稱。編譯器會很樂意將它轉換爲指向單個整數的指針。

&my_array是一個指向5個整數數組的指針。編譯器不會將整數數組視爲單個整數,因此拒絕進行轉換。

+0

+1用於將整數數組視爲單個整數的區別。 – 2011-05-10 21:22:08

+1

爲什麼你說「是一個數組的引用」而不是「是一個數組」? – fredoverflow 2011-05-10 21:24:24

+0

@FredOverflow,你說得對,它在技術上並不是一個參考。我編輯了答案來反映這一點。儘管如此,我仍然認爲它有助於*認爲它是一個參考。 – 2011-05-10 21:32:06

-1

&my_array是存儲值my_array的地址,即它是陣列地址的地址並且具有類型int**

+3

知道'my_array'和'&myArray [0]'是同樣的東西也可能是有用的。我已經看到後者用於代碼,可能只是爲了清楚。 – 2011-05-10 21:10:55

+8

不,'&my_array' does not not ** have type'int **'。 – 2011-05-10 21:12:34

+3

@slavik:不,他們不是。前者是一個數組,後者是一個指針。 – GManNickG 2011-05-10 21:22:02

-1

這將是神經科學,語義學和軟件開發研究的一個迷人的話題。儘管我們可以解釋my_array和my_array之間的區別,儘管我們可以重複「數組是(或不是)指針」的口頭禪,但這種區別仍然令人困惑。

通常,當我們將「&」操作的地址帶到某個地址時,我們會得出完全不同的值。

int x; 
x=5; 
cout <<x << " "<<&x<<endl; 

首先,讓我們來挑戰這種直覺。可以將指針意外等於它正指向值:

int* x; 
x=(int*)(&x); 
cout <<"same: "<<x << " "<<&x<<endl; 

因此,在某些情況下語義不同的東西可以計算出相同的事情。但僅僅因爲在當前情況下兩個表達式是相同的,並不意味着它們是可以互換的。

int w=3; 
int* ip=&w; 
void* vp=&w; 
cout <<"Equal: "<<ip<<" "<<vp<<" "<<(ip==vp)<<endl; 
cout <<"But not interchangeable: "<<ip+1<<" "<<vp+1<<" "<<(ip+1==vp+1)<<endl; 

指向數組的指針也是一樣。指向數組的指針在技術上通常與數組本身「平等」,但由於它們具有不同的語義,因此在某些情況下它們不可互換。試試這個:

int my_array[5] = {5,6,7,8,9}; 
cout <<my_array[0]<<endl; // output 5 
cout <<(&my_array)[0]<<endl; // outputs the address of the first element 
cout <<sizeof my_array[0]<<endl; // outputs 4 
cout <<sizeof (&my_array)[0]<<endl; // outputs 20 
相關問題