指向數組第一個元素。

指向數組的指針和指向數組第一個元素的指針是不一樣的概念

指向數組的指針:int (*p)[n], p是一個指向n個int元素數組的指針。

指向數組第一個元素的指針(即指針退化後的值):int *p; 就是一個普通的指向一個元素的指針。

int a[10];

雖然 a == a == (a[0]),但是他們的類型是不一樣的,配合sizeof操作符就可以體現出來。


說「指向數組第一個元素的指針」肯定是對的。

「指向數組的指針」聽起來像一個二重指針,但平時交流可能會有「指向數組第一個元素的指針」簡稱為「指向數組的指針」的情況。在不需要二重指針的語境下,這麼說可以省點口水。


指向單個元素,畢竟退化了嘛。


3.11更新

在網上找的文章有人痛心疾首地批那些把數組當指針的人,無非就是無法賦值的問題

在評論區我已經表述了為什麼編譯器不讓數組進行賦值的原因:因為這樣做會丟失數組的sizeof信息

如果還有人認為sizeof可以在運行時動態地更改的話,那麼請你解釋一下為什麼C/C++的數組在運行時不會進行越界檢查?答案就是sizeof的值是編譯器確定的,就類似於一個#define,包括把sizeof寫到模板裏,同樣也是編譯器確定的。運行的時候,程序是不會保存數組的大小信息的,它只是一個指針,所以才會出現訪問越界的情況。

可能還有人要問:

int a[10];
a[10000];

同樣是越界訪問啊,為什麼編譯器不會檢查呢?你騙人,你無知。

那麼我問你,這樣的寫法編譯器怎麼檢查:

int i;
std::cin &>&> i;
int a[10] = {0};
std::cout &

你告訴我怎麼檢查。

就像一塊豆腐,可以是嫩豆腐,老豆腐,凍豆腐,臭豆腐。我現在把豆腐打成花,你告訴我這不是豆腐。因為豆腐花不是一塊一塊四四方方的,所以不是豆腐,嫩豆腐、老豆腐、凍豆腐都能形成規則的塊狀,所以它們都是豆腐。因為數組不能賦值,所以它不是指針。

數組是個特異的指針,它不能完成指針的所有操作是因為它有其本身的作用

有一個人(不知從哪裡來的),和你長得一模一樣,身體裏的內臟、血液和你都一模一樣,在相同的條件下他能做出和你完全一致的反應,唯一的區別是他不能離開某一個特定的房間,請問,他是不是你?

============原回答============

數組其實就是指針,這點各個編譯器其實已經給出答案了。比如下面這段代碼:

int a[3] = {0, 1, 2};
for(int i = 0; i &< 3; i++) printf("%d", i[a]); // i[a] == *(i + a) == *(a + i) == a[i]

那麼,數組是什麼?數組是內存中的連續的一串內存,比如:

Address 0xa0 0xa1 0xa2 0xa3
Value 00 00 00 61

如果我們現在定義一個int指針指向0xa0

int *ptr;
ptr = 0xa0;
printf("%d", *ptr);

得到的結果就是0x61,即97。

但如果換成char型指針呢?

char *ptr;
ptr = 0xa0;
printf("%c", *(ptr + 3));

得到的結果是a。為什麼呢?

當你定義某一個元素的指針的時候,編譯器其實是知道這一元素在內存中的大小的,比如int就是4位元組,char就是1位元組,在對指針做加減法的實質是從這個指針所指的地址開始增減X個元素大小個位元組,比如假設int型指針ptr的值為0xa0,那麼對ptr+4就是取0xa0之後的4*sizeof(int) = 16的地址,即0xb0。

那麼你也就能理解為什麼數組就是指針了。

這也就是為什麼void類型不能定義變數和數組,只能定義為指針。因為void的所佔內存大小為0,定義一個不要內存的變數是毫無意義的,而且對void類型的數組做任何加法都是*(ptr + 0)的形式,而指針則能通過強制轉換為別的類型的元素的指針,對其進行加減法。

void a[3]; // Invalid
void* b = 0xa0;
printf("%d", *((char*)b + 3)); // Valid

同時,void類型的指針也是函數傳參時豐富多樣性的方式,比如你設計了一個函數,其中參數argType==1時,指針ptr傳入int類型,argType==2時,指針ptr傳入char類型:

int foo(int argType, void* ptr){
if(argType == 1){
int *p = (int*)ptr;
// Do sth.
else if(argType == 2){
char *p = (char*)ptr;
// Do sth.
}
return 0;
}

這時候你可能會問:所以你說了這麼半天我的問題你回答了嗎?

當你明白數組就是指針的時候,答案已經不言而喻了。


標準明確指出,會退化成指向數組首元素的指針。


推薦閱讀:
相關文章