標籤:
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語言指標與數組之間關係