C/C++應該是大學里最先接觸的編程語言,它們的重要性不言而喻。但是我始終抱著“數(shù)組名就是指針”的錯誤信條到現(xiàn)在,可能是因為大學老師錯誤的講解使我一直保留著這種誤解。指針是C/C++語言的特色,而數(shù)組名與指針有太多的相似,甚至很多時候,數(shù)組名可以作為指針使用,所以也難免在學習中將兩者混淆。這里介紹下指針和數(shù)組名的區(qū)別:
1.指針和數(shù)組名占據(jù)的內(nèi)存空間大小不一樣,如下程序1:char str[10];char *pstr=str;cout<<cout<<sizeof第一行輸出結(jié)果是:10,第二行輸出結(jié)果是:4
從這里我們可以看出:數(shù)組名對應著(而不是指向)一塊內(nèi)存(數(shù)組所占的內(nèi)存區(qū)域)或者說是指代數(shù)組這種數(shù)據(jù)結(jié)構(gòu),其地址與容量在生命期內(nèi)保持不變,只有數(shù)組的內(nèi)容可以改變。指針對應著一個占據(jù)4個字節(jié)(Win32)的內(nèi)存區(qū)域,而指向這4個字節(jié)所存儲的地址所對應的內(nèi)存單元,它可以指向任意類型的內(nèi)存塊。因此,sizeof(str)值為數(shù)組占據(jù)的內(nèi)存空間大小即10個字節(jié),而sizeof(pstr)值為指針的值占據(jù)的內(nèi)存空間大小即4個字節(jié)。
2.數(shù)組名不是指針,但是在一定的情況下轉(zhuǎn)換為指代數(shù)組的首地址的指針,而這個數(shù)組名轉(zhuǎn)為的指針只能是指針常量。在以下兩種情況下才能進行這種轉(zhuǎn)換:a.在程序1第二行代碼中,將數(shù)組名直接賦值給指針,此時數(shù)組名轉(zhuǎn)換為指向數(shù)組的首單元的常量指針。b.直接將數(shù)組名作為指針形參的時候,數(shù)組名則轉(zhuǎn)換為指向數(shù)組的首單元的常量指針進行傳遞,如下程序2:void fun(char str[]){cout<<str++;}void main(){…char str1[5];fun(str1);…}注意:數(shù)組名作為函數(shù)形參進行傳遞時,在子函數(shù)體內(nèi),它已經(jīng)不再是一個指針常量,而是變成一個真正的指針,可以進行增減等操作,可以被修改。所以程序2中子程序第一條語句輸出的sizeof(str)的值為4.
既然數(shù)組名可以被看作指針常量,而常量是不能修改的,那么如下代碼是不允許的:char str[10];str++;但如下代碼則合法的:char str[10];char *pstr=str;pstr++;3.使用指針訪問數(shù)組和使用數(shù)組名訪問數(shù)組本質(zhì)不同。例如:char str[7]=”ksarea”;char *pstr=str;cout<<<