引言
指針是C/C++語言的特色,而數(shù)組名與指針有太多的相似,甚至很多時候,數(shù)組名可以作為指針使用。于是乎,很多程序設(shè)計者就被搞糊涂了。而許多的大學老師,他們在C語言的教學過程中也錯誤得給學生講解:"數(shù)組名就是指針"。很幸運,我的大學老師就是其中之一。時至今日,我日復一日地進行著C/C++項目的開發(fā),而身邊還一直充滿這樣的程序員,他們保留著"數(shù)組名就是指針"的誤解。
想必這種誤解的根源在于國內(nèi)某的C程序設(shè)計教程。如果這篇文章能夠糾正許多中國程序員對數(shù)組名和指針的誤解,筆者就不甚欣慰了。借此文,筆者站在無數(shù)對知識如饑似渴的中國程序員之中,深深寄希望于國內(nèi)的計算機圖書編寫者們,能以"深入探索"的思維方式和精益求精的認真態(tài)度來對待圖書編寫工作,但愿市面上多一些融入作者思考結(jié)晶的心血之作!
魔幻數(shù)組名
請看程序(本文程序在WIN32平臺下編譯):
1. #include
2. int main(int argc, char* argv[])
3. {
4. char str[10];
5. char *pStr = str;
6. cout << sizeof(str) << endl;
7. cout << sizeof(pStr) << endl;
8. return 0;
9. }
1、數(shù)組名不是指針
我們先來*"數(shù)組名就是指針"的說法,用反證法。
證明 數(shù)組名不是指針
假設(shè):數(shù)組名是指針;
則:pStr和str都是指針;
因為:在WIN32平臺下,指針長度為4;
所以:第6行和第7行的輸出都應該為4;
實際情況是:第6行輸出10,第7行輸出4;
所以:假設(shè)不成立,數(shù)組名不是指針
2、數(shù)組名神似指針
上面我們已經(jīng)證明了數(shù)組名的確不是指針,但是我們再看看程序的第5行。該行程序?qū)?shù)組名直接賦值給指針,這顯得數(shù)組名又的確是個指針!
我們還可以發(fā)現(xiàn)數(shù)組名顯得像指針的例子:
1. #include
2. #include
3. int main(int argc, char* argv[])
4. {
5. char str1[10] = "I Love U";
6. char str2[10];
7. strcpy(str2,str1);
8. cout << "string array 1: " << str1 << endl;
9. cout << "string array 2: " << str2 << endl;
10. return 0;
11. }
標準C庫函數(shù)strcpy的函數(shù)原形中能接納的兩個參數(shù)都為char型指針,而我們在調(diào)用中傳給它的卻是兩個數(shù)組名!函數(shù)輸出:
string array 1: I Love U
string array 2: I Love U
數(shù)組名再一次顯得像指針!
既然數(shù)組名不是指針,而為什么到處都把數(shù)組名當指針用?于是乎,許多程序員得出這樣的結(jié)論:數(shù)組名(主)是(謂)不是指針的指針(賓)。
整個一魔鬼。
指針是C/C++語言的特色,而數(shù)組名與指針有太多的相似,甚至很多時候,數(shù)組名可以作為指針使用。于是乎,很多程序設(shè)計者就被搞糊涂了。而許多的大學老師,他們在C語言的教學過程中也錯誤得給學生講解:"數(shù)組名就是指針"。很幸運,我的大學老師就是其中之一。時至今日,我日復一日地進行著C/C++項目的開發(fā),而身邊還一直充滿這樣的程序員,他們保留著"數(shù)組名就是指針"的誤解。
想必這種誤解的根源在于國內(nèi)某的C程序設(shè)計教程。如果這篇文章能夠糾正許多中國程序員對數(shù)組名和指針的誤解,筆者就不甚欣慰了。借此文,筆者站在無數(shù)對知識如饑似渴的中國程序員之中,深深寄希望于國內(nèi)的計算機圖書編寫者們,能以"深入探索"的思維方式和精益求精的認真態(tài)度來對待圖書編寫工作,但愿市面上多一些融入作者思考結(jié)晶的心血之作!
魔幻數(shù)組名
請看程序(本文程序在WIN32平臺下編譯):
1. #include
2. int main(int argc, char* argv[])
3. {
4. char str[10];
5. char *pStr = str;
6. cout << sizeof(str) << endl;
7. cout << sizeof(pStr) << endl;
8. return 0;
9. }
1、數(shù)組名不是指針
我們先來*"數(shù)組名就是指針"的說法,用反證法。
證明 數(shù)組名不是指針
假設(shè):數(shù)組名是指針;
則:pStr和str都是指針;
因為:在WIN32平臺下,指針長度為4;
所以:第6行和第7行的輸出都應該為4;
實際情況是:第6行輸出10,第7行輸出4;
所以:假設(shè)不成立,數(shù)組名不是指針
2、數(shù)組名神似指針
上面我們已經(jīng)證明了數(shù)組名的確不是指針,但是我們再看看程序的第5行。該行程序?qū)?shù)組名直接賦值給指針,這顯得數(shù)組名又的確是個指針!
我們還可以發(fā)現(xiàn)數(shù)組名顯得像指針的例子:
1. #include
2. #include
3. int main(int argc, char* argv[])
4. {
5. char str1[10] = "I Love U";
6. char str2[10];
7. strcpy(str2,str1);
8. cout << "string array 1: " << str1 << endl;
9. cout << "string array 2: " << str2 << endl;
10. return 0;
11. }
標準C庫函數(shù)strcpy的函數(shù)原形中能接納的兩個參數(shù)都為char型指針,而我們在調(diào)用中傳給它的卻是兩個數(shù)組名!函數(shù)輸出:
string array 1: I Love U
string array 2: I Love U
數(shù)組名再一次顯得像指針!
既然數(shù)組名不是指針,而為什么到處都把數(shù)組名當指針用?于是乎,許多程序員得出這樣的結(jié)論:數(shù)組名(主)是(謂)不是指針的指針(賓)。
整個一魔鬼。

