標籤:
c/c++ (疑1)數組和指標
c/c++(疑2) const extern
有了前面 兩篇 基礎,下面我們可以更深入的來介紹c/c++(疑3) C語言指標與數組之間關係
1 概述(C語言指標與數組之間關係)
指標就是指標,指標變數在32 位系統下,永遠佔4 個byte,其值為某一個記憶體的地址。指標可以指向任何地方,但是不是任何地方你都能通過這個指標變數訪問到。
數組就是數組,其大小與元素的類型和個數有關。定義數組時必須指定其元素的類型和個數。數組可以存任何類型的資料,但不能存函數。
2 a 和&a 的區別(為下文C語言指標數組和數組指標埋下伏筆)
來看看下面的代碼
<pre name="code" class="cpp">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 d8int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));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語言指標與數組之間關係