在C++中,數組永遠不會按值傳遞。它是傳遞第0個元素的指針(即首地址)。
例如,如下聲明:
void putValues(int[10]);
被編譯器視為:
void putValues(int*);
數組的長度與數組的聲明無關。因此,下列三個聲明是等價的:
void putValues(int*);
void putValues(int[]);
void putValues(int[10]);
因為數組被傳遞為指針,所以這對程序員有兩個含義:
1. 在被調函數內對參數數則的改變將被應用到數則實參上而不是本地拷貝上。當用作實參的數組必須保持不變時,程序員需要保留原始數組的拷貝。函數可以通過把參數類型聲明為const來表明不希望改變數組元素:
void putValues(const int[10]);
2. 數組長度不是參數類型的一部分。函數不知道傳遞給它的數組的實際長度,編譯器也不知道。而編譯器對實參類型進行參數類型檢查時,並不檢查數組的長度。例如:
void putValues(int[10]); //視為 int*
int main(){
int i, j[2];
putValues(&i); //ok: &i是int*;潛在的運行錯誤
putValues(j); //ok: j被轉換成第0個元素的指針
renturn 0;
}
那麼什麼情況下數組不會退化為指針類型呢?
數則不會退化的情況就三種,我們只要記下來就好了!
1. 初始化的時候。如int a[2] = {1,2}; 此時的a為數組
2. sizeof的時候。如 sizeof(a)此時的a也為數組
3. &a,此時a為指向一個還有兩個整型值的數組
《C++ 設計新思維》 下載見 http://www.linuxidc.com/Linux/2014-07/104850.htm
C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm
讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm
讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm
將C語言梳理一下,分布在以下10個章節中: