指標和數組名的區別

來源:互聯網
上載者:User

C/C++應該是大學裡最先接觸的程式設計語言,它們的重要性不言而喻。但是我始終抱著“數組名就是指標”的錯誤信條到現在,可能是因為大學老師錯誤的講解使我一直保留著這種誤解。指標是C/C++語言的特色,而數組名與指標有太多的相似,甚至很多時候,數組名可以作為指標使用,所以也難免在學習中將兩者混淆。這裡介紹下指標和數組名的區別:

1.指標和數組名佔據的記憶體空間大小不一樣,如下程式1:

  1. char str[10];
  2. char *pstr=str;
  3. cout&lt;<sizeof(str)>&lt;<endl;>
  4. cout&lt;<sizeof(pstr);>
  5. </sizeof(pstr);>
  6. 第一行輸出結果是:10,第二行輸出結果是:4</endl;></sizeof(str)>

從這裡我們可以看出:數組名對應著(而不是指向)一塊記憶體(數組所佔的記憶體地區)或者說是指代數組這種資料結構,其地址與容量在生命期內保持不變,只有數組的內容可以改變。指標對應著一個佔據4個位元組(Win32)的記憶體地區,而指向這4個位元組所儲存的地址所對應的記憶體單元,它可以指向任意類型的記憶體塊。因此,sizeof(str)值為數組佔據的記憶體空間大小即10個位元組,而sizeof(pstr)值為指標的值佔據的記憶體空間大小即4個位元組。

2.數組名不是指標,但是在一定的情況下轉換為指代數組的首地址的指標,而這個數組名轉為的指標只能是指標常量。
在以下兩種情況下才能進行這種轉換:
a.在程式1第二行代碼中,將數組名直接賦值給指標,此時數組名轉換為指向數組的首單元的常量指標。
b.直接將數組名作為指標形參的時候,數組名則轉換為指向數組的首單元的常量指標進行傳遞,如下程式2:

  1. void fun(char str[])
  2. {
  3. cout&lt;<sizeof(str)>&lt;<endl;>
  4. str++;
  5. }
  6. void main()
  7. {
  8. ...
  9. char str1[5];
  10. fun(str1);
  11. ...
  12. }
  13. </endl;>
  14. 注意:數組名作為函數形參進行傳遞時,在子函數體內,它已經不再是一個指標常量,而是變成一個真正的指標,可以進行增減等操作,可以被修改。所以程式2中子程式第一條語句輸出的sizeof(str)的值為4.</sizeof(str)>

既然數組名可以被看作指標常量,而常量是不能修改的,那麼如下代碼是不允許的:

  1. char str[10];
  2. str++;

但如下代碼則合法的:

  1. char str[10];
  2. char *pstr=str;
  3. pstr++;

3.使用指標訪問數組和使用數組名訪問數組本質不同。
例如:

  1. char str[7]="ksarea";
  2. char *pstr=str;
  3. cout&lt;<str[3]>&lt;<endl>&lt;
  4. <pstr[3];>
  5. </pstr[3];> </endl>
  6. 其中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]>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.