C/C++應該是大學裡最先接觸的程式設計語言,它們的重要性不言而喻。但是我始終抱著“數組名就是指標”的錯誤信條到現在,可能是因為大學老師錯誤的講解使我一直保留著這種誤解。指標是C/C++語言的特色,而數組名與指標有太多的相似,甚至很多時候,數組名可以作為指標使用,所以也難免在學習中將兩者混淆。這裡介紹下指標和數組名的區別:
1.指標和數組名佔據的記憶體空間大小不一樣,如下程式1:
- char str[10];
- char *pstr=str;
- cout<<sizeof(str)><<endl;>
- cout<<sizeof(pstr);>
- </sizeof(pstr);>
- 第一行輸出結果是:10,第二行輸出結果是:4</endl;></sizeof(str)>
從這裡我們可以看出:數組名對應著(而不是指向)一塊記憶體(數組所佔的記憶體地區)或者說是指代數組這種資料結構,其地址與容量在生命期內保持不變,只有數組的內容可以改變。指標對應著一個佔據4個位元組(Win32)的記憶體地區,而指向這4個位元組所儲存的地址所對應的記憶體單元,它可以指向任意類型的記憶體塊。因此,sizeof(str)值為數組佔據的記憶體空間大小即10個位元組,而sizeof(pstr)值為指標的值佔據的記憶體空間大小即4個位元組。
2.數組名不是指標,但是在一定的情況下轉換為指代數組的首地址的指標,而這個數組名轉為的指標只能是指標常量。
在以下兩種情況下才能進行這種轉換:
a.在程式1第二行代碼中,將數組名直接賦值給指標,此時數組名轉換為指向數組的首單元的常量指標。
b.直接將數組名作為指標形參的時候,數組名則轉換為指向數組的首單元的常量指標進行傳遞,如下程式2:
- void fun(char str[])
- {
- cout<<sizeof(str)><<endl;>
- str++;
- }
- void main()
- {
- ...
- char str1[5];
- fun(str1);
- ...
- }
- </endl;>
- 注意:數組名作為函數形參進行傳遞時,在子函數體內,它已經不再是一個指標常量,而是變成一個真正的指標,可以進行增減等操作,可以被修改。所以程式2中子程式第一條語句輸出的sizeof(str)的值為4.</sizeof(str)>
既然數組名可以被看作指標常量,而常量是不能修改的,那麼如下代碼是不允許的:
- char str[10];
- str++;
但如下代碼則合法的:
- char str[10];
- char *pstr=str;
- pstr++;
3.使用指標訪問數組和使用數組名訪問數組本質不同。
例如:
- char str[7]="ksarea";
- char *pstr=str;
- cout<<str[3]><<endl><
- <pstr[3];>
- </pstr[3];> </endl>
- 其中str[3]和pstr[3]返回的都是字元'r',但是編譯器產生的執行代碼卻不一樣。對於str[3],執行代碼是從str開始,向後移動兩個位元組,然後取出其中的字元;而對於pstr[3],執行代碼是從pstr中取出地址,然後在其上加3,然後取出對應記憶體中的字元。當然,如果pstr是指向int型的指標,那麼pstr[3]的處理過程是從pstr中取出地址,然後在其上加上3*sizeof(int),最後取出對應記憶體中的字元,其他的資料類型一次類推。<span id="more-73"></span><!--more--><!--more--><!--more--><!--more--><!--more--><!--more--><!--more--></str[3]>