陣列和指標:
(一)一維陣列和指標
int a[2] = ;
int *p;
p = a
首先 p 指向 a,因為陣列的名字就是指標,而且型別是 int 所以這裡簡單的匹配了。
那麼*p == a[0] == 0x12345678
*(p+1) = a[1] = 90;
注意指標位址加一這個操作,關鍵是看指標的型別,現在這裡指標既然是指向了int陣列
那麼裡面元素的型別也應該是 int,所以 p+1 這個操作應該是移動了乙個 int 。
於是一種比較常用的處理手段出現了。
a[0] 元素是 int 型,4個位元組,那麼我怎麼訪問裡面的每乙個位元組呢?
那麼可以通過
*((char *)p + 1)
這裡有兩個括號,優先順序規則當然是裡面的括號最優先,首先將 p 的型別是 int * 強制
轉換為 char * ,那麼現在型別邊了, p+1 訪問的應該是原來的指標位址移動乙個位元組!
注意是位元組。
0x12345678 這個數字,應該指向 0x56 ,因為pc是little endian小端格式,低位元組先存放
得到的結果就能很好的解釋了。
(二)二維陣列和指標
(1)位址代表的意義
首先理解,二維陣列,例如
int arry[2][3]=,};
這樣寫是最好理解的,也就是說2行3列。其中也可以看成是2個一維陣列的整合,也就是
arry[0] = ;
arry[1] = ;
簡單測試一下一些符號究竟代表的是什麼意思
printf("\n%x",arry);
printf("\n%x",arry[0]);
printf("\n%x",&arry[0][0]);
printf("\n%x",arry+1);
printf("\n%x",arry[1]+1);
printf("\n%x",&arry[1][1]+1);
從編譯執行的結果來看
12ff68
12ff68
12ff68
12ff74
12ff78
12ff7c
arry 是這個陣列的名字,也就是代表著入口位址,剛才說了,二維陣列實際可以看成n個
一維陣列,例如本例中,arry[0] 代表著其中的第乙個一維陣列,那麼 arry[1] 就代表著
第二個一維陣列,而且這裡是位址,注意 arry[0] 本身就代表著位址了。
arry[0][0]本身代表著這個元素,那麼取位址之後 &arry[0][0] 就變成了,這個元素的位址
然而將每個位址加一後發現,這些位址代表的語義並不相同。
arry+1 之後位址變成 12ff68 到 12ff74 也就是說,指向了 第二行第乙個元素 23
arry[1]本身就代表著第二個一維陣列的入口位址,加一之後就只想這個陣列的第二個元素
那麼就應該指向 45,從位址可以看出。
&arry[1][1]+1 這個是以元素為單位,首先 arry[1][1]這個元素為基準,也就是 45 ,然後
再後移乙個元素,所以應該指向 6.參考
(2)二維陣列怎麼傳遞引數
void disparry(int a[2][3])
void main(void),};
int (*c)[3]=arry;
int *p;
p =(int *)arry;
disparry((int (*)[3])p);
disparry(c); }
可以通過兩種辦法,第一是通過 int * 型別的指標 *p 來處理。首先因為 p 是 int* 型別,
而 arry是二維陣列,不等價不能直接賦值,那麼就簡單的將二維陣列指標轉換為 int* 型別
這樣就匹配了,產生的效果是 p 指向了 arry 的入口。
然後 disparry 函式需要的引數的型別是 int a[2][3],很顯然,這個時候 p又不能作為引數
了,當然直接傳遞的話,執行結果不錯,但是會有 warning 的。於是再一次將 int * 轉換為
需要的 int (*)[3] 型別,說白了,就是 陣列指標。
那麼第二種辦法就很乾脆,定義乙個陣列指標c指向 arry,那麼 c就可以直接傳遞了。
(3)使用 typedef 定義二維陣列
typedef int a[2];
a b[3]=;
printf("\n%d",b[1][0]);
可以看出,先定義一種新的資料型別 a,他是乙個 2個元素的一維陣列。然後再定義乙個含有
3個 a 型別的一維陣列b,這樣b其實就是乙個二維陣列了,b[3]代表的是有3行這樣的一維陣列
所以這樣下來實際上等效於 b[3][2]。
陣列指標和指標陣列
陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指向...
陣列指標和指標陣列
一 定義 陣列指標 陣列指標 是指向陣列 首元素的位址的 指標,其本質為指標 這個指標存放的是陣列首位址的位址,相當於2級指標,這個指標不可移動 指標陣列 陣列元素為指標的陣列,其本質為陣列。二 舉例 int a 3 4 這個無需多說,就是乙個 二維陣列 int p 4 就相當於int p 4 它就...
陣列指標和指標陣列
這兩個名字不同當然所代表的意思也就不同。我剛開始看到這就嚇到了,主要是中文太博大精深了,整這樣的簡稱太專業了,把人都繞暈了。從英文解釋或中文全稱看就比較容易理解。指標陣列 array of pointers,即用於儲存指標的陣列,也就是陣列元素都是指標 陣列指標 a pointer to an ar...