C/C++數(shù)組名與指針區(qū)別深入探索

字號:

引言
    指針是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ù)組名(主)是(謂)不是指針的指針(賓)。
    整個一魔鬼。