數組名賦給函數形參會退化為指針,那麼這個指針是指向數組的指針還是指向單個元素的指針?
指向數組第一個元素。
指向數組的指針和指向數組第一個元素的指針是不一樣的概念
指向數組的指針: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;
}
這時候你可能會問:所以你說了這麼半天我的問題你回答了嗎?
當你明白數組就是指針的時候,答案已經不言而喻了。
標準明確指出,會退化成指向數組首元素的指針。
推薦閱讀: