二維陣列和指標的一些感悟

2021-06-20 18:51:47 字數 2404 閱讀 9213

編譯器: 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到底指向幾個指標是不知道的...