c/c++(疑3) C語言指標與數組之間關係

來源:互聯網
上載者:User

標籤:

c/c++ (疑1)數組和指標

c/c++(疑2) const extern

有了前面 兩篇 基礎,下面我們可以更深入的來介紹c/c++(疑3) C語言指標數組和數組指標

1 概述(C語言指標與數組之間關係)

指標數組:首先它是一個數組,數組的元素都是指標,數組佔多少個位元組由數組本身決定。它是“儲存指標的數組”的簡稱。
數組指標:首先它是一個指標,它指向一個數組。在32 位系統下永遠是佔4 個位元組,至於它指向的數組佔多少位元組,不知道。它是“指向數組的指標”的簡稱。


2     a 和&a 的區別(為下文C語言指標數組和數組指標埋下伏筆)

來看看下面的代碼
int _tmain(int argc, _TCHAR* argv[]){int a[4]={1,2,3,4};int *ptr0 = (int*)(int)a;//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 cc cc ccint *ptr1=(int *)(&a+1);int *ptr2=(int *)((int)a+1);//00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 cc cc cc ccint *ptr3 = (int *)((int)a+2);//00 00 02 00 00 00 03 00 00 00 04 00 00 00 cc cc cc cc 3cint *ptr4 = (int *)((int)a+3);//00 02 00 00 00 03 00 00 00 04 00 00 00 cc cc cc cc 3c d2int *ptr5 = (int *)((int)a+4);//02 00 00 00 03 00 00 00 04 00 00 00 cc cc cc cc 3c d2 d8
<span style="white-space:pre"><span style="color: rgb(51, 51, 51); font-family: 'Microsoft Yahei', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 22.399999618530273px; background-color: rgb(238, 238, 238);">int *ptr=(int *)(&a+1);</span><br style="color: rgb(51, 51, 51); font-family: 'Microsoft Yahei', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 22.399999618530273px; background-color: rgb(238, 238, 238);" /><span style="color: rgb(51, 51, 51); font-family: 'Microsoft Yahei', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 22.399999618530273px; background-color: rgb(238, 238, 238);">   <span style="white-space:pre"></span>printf("%d,%d",*(a+1),*(ptr-1));</span></span>//printf("%x,%x,%x,%x,%x,%x",ptr1[-1],*ptr2,*ptr3,*ptr4,*ptr5);  下一篇文章講解getchar();/*a  0x00C4F810&a[0] 0x00C4F810&a 0x00C4F810*/return 0;}
上面的注釋是我通過查看記憶體 和 彙編 的一些注釋,也保留下來了,可能每台機器不一樣,所以地址也不一樣。
解釋說明:
對指標進行加1 操作,得到的是下一個元素的地址,而不是原有地址值直接加1。所以,一個類型為T 的指標的移動,以sizeof(T) 為移動單位。因此,對上題來說,a 是一個一維數組,數組中有5 個元素; ptr * 是一個int 型的指標。

&a + 1: 取數組a 的首地址,該地址的值加上sizeof(a) 的值,即&a + 4*sizeof(int),也就是下一個數組的首地址,顯然當前指標已經越過了數組的界限。

(int *)(&a+1): 則是把上一步計算出來的地址,強制轉換為int * 類型,賦值給ptr1。

*(a+1): a,&a 的值是一樣的,但意思不一樣,a 是數組首元素的首地址,也就是a[0]的首地址,&a 是數組的首地址,a+1 是數組下一元素的首地址,即a[1]的首地址,&a+1 是下一個數組的首地址。所以輸出2*(ptr-1): 因為ptr 是指向a[4],並且ptr 是int * 類型,所以*(ptr-1) 是指向a[3] ,輸出4。




//printf("%x,%x,%x,%x,%x,%x",ptr1[-1],*ptr2,*ptr3,*ptr4,*ptr5);  下一篇文章講解

這個相對來說 稍有複雜,設計到記憶體 和 大小端 


c/c++(疑3) C語言指標與數組之間關係

聯繫我們

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