編譯器: vc++6.0 win32 platform program
陣列和指標:
(一)一維陣列和指標
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]。
一維指標和二維指標指向二維陣列的一些問題
廢話少說,先上自己dev c 上的 include int main p,rp 3 q,i p int c rp c q c printf rp d n rp p n c p n p p n q p n q d n rp rp,c p,q q printf rp 1 p n p 1 p n rp 1...
二維陣列 二維陣列和指標
include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...
二維指標和二維陣列
二維指標和二維陣列有三種形式 1,type ptr 2,type ptr或者type prt 3,type prt 三種形式意思相近,也有區別。首先三種形式都能表示二維的資料結構。1,type ptr 表示乙個指向指標的指標 但是在一開始宣告的時候 type ptr ptr到底指向幾個指標是不知道的...