數組與指標的差別

來源:互聯網
上載者:User

先來看一個例子:

檔案1:int array_a[3]={1, 2, 3}

檔案2:extern int *array_a;  printf(“%d”, array_a[2]);

請問輸出是多少。

答案是運行時會出錯,原因是訪問了不可訪問的記憶體。將extern int *array_a改為extern int array_a[]後正常輸出。

為什麼會出現這樣的情況呢。

出現這個問題的原因是編譯器對數組和指標的解釋是不同的。

使用extern int *array_a; 作聲名,編譯器會把array_a理解為一個指向int 的指標,對指標的訪問是先取址然後在定址的過程。

而如果使用extern int array_a[], 編譯器會把array_a理解為一個數組,訪問時直接加上位移量進行定址即可。

說得直白一點:如果你使用聲名extern int *array_a; printf(“%x/n”, array_a); 想一下你會得到什麼值,你可能會毫不猶豫地說是一個地址,但是很遺憾,你說錯了。答案是 數組的第一元素的值。原因是什麼呢。注意到我們定義的array_a確確實實是一個數組,但我們卻把它聲名為一個指標。對於一個數組名,只有在作為函數參數進行傳遞或者傳遞給左值時,它才會被編譯器解釋為地址,否則它表示的是數組的第一個元素的值。

在上面的例子中,我們將array_a聲名為int *, 但array_a其實是一個數組,因此array_a[2]就成了*(1+2) (注意array_a的第一元素被賦值為1), 當然會出錯了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.