一維指標和二維指標指向二維陣列的一些問題

2021-07-09 15:36:30 字數 2407 閱讀 6801

廢話少說,先上自己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,p

+1);

for(i=

0;i<6;

i++)

printf

("\n"

);

for(i=

0;i<6;

i++)

return

0;}

首先定義乙個2*3的二維陣列,定義乙個一維指標p和q,定義乙個指向指標的指標(*rp)[3],問題來了!

第一種賦值方法:將二維陣列c強制轉換成一維的指標型別,並將其賦給一維指標p(**第4行)

第一種賦值方法和第二種賦值方法的區別是:

第一種賦值方法可以通過dev c++的編譯,第二種賦值方法不能通過dev c++的cpp檔案編譯(會出現error),在字尾名為c 的檔案中會出現warning(警告的中文意思是指標型別不匹配),但可以執行!

兩者執行得結果均為

因此兩種的賦值方法在本質上區別不大,但通過查閱資料得知,c++對指標的要求很嚴格,因此建議如果要用一維指標指向二維陣列時候,採用第一種直接強制型別轉換的方法比較合法規範,這樣會避免出現無可預知的錯誤!

二.一維指標和二維指標的偏移位址問題

在**的定義型別上,(*rp)[3]表示指向含3個元素的一維整形陣列的指標變數,通俗的說法是指向指標的指標,也即是二維指標,為了規範,我用強制型別轉換的一維指標p與二維指標rp就偏移位址的問題做乙個比較。

**第八行:printf("*(rp+1)=%p\n*(p + 1)=%p\n", rp+1,p + 1);

執行的結果是:

再與初始定義的位址相比較:

仔細比較後發現,一維指標和二維指標偏移位址為1時候,一維指標位址偏移了4,二維指標位址偏移了12(指標位址都是以16進製表示)

原因:二維指標rp的首位址是c[0],一維指標p的首位址是c[0][0],因此rp+1的位址即是c[0]+1==c[1]的位址(這個位址同時也是c[1][0]的位址,p+1的位址即是c[0][0]+1==c[0][1]的位址

(如果不懂,可以參考一下中山大學2023年軟體學院的程式設計理論考試關於指標的一道填空題來理解:

填空題有一問是: *q

+3-p=?

參***是6,下面就用上面的分析來解釋答案為什麼是6

#include

int

main();

int*p =

(int*)a

;

int(*q)[

4]=a

;p +=1

;q +=1

;printf

("%d\n",*

p);printf

("%d\n",**

q);printf

("%d\n",(*

q)[2]);

printf

("%d\n",*

q+3-

p);printf

("*q=%p\n",*

q);printf

("p=%p\n",p

);

return

0;}

p是一維指標,初始位址為a[0][0],所以p+1的位址為a[0][1],q是二維指標,初始位址為a[0],所以q+1的位址為a[1][0],

程式執行後的結果如下

所以p和q的位址相差3(0x10-0x04=12,12/4=3),再加3即為答案6!

這就是一維陣列和二維陣列的位址偏移的大致區別。

二維指標和二維陣列

二維指標和二維陣列有三種形式 1,type ptr 2,type ptr或者type prt 3,type prt 三種形式意思相近,也有區別。首先三種形式都能表示二維的資料結構。1,type ptr 表示乙個指向指標的指標 但是在一開始宣告的時候 type ptr ptr到底指向幾個指標是不知道的...

二維陣列 二維陣列和指標

include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...

二維陣列與指向二維陣列的指標

指標陣列 是陣列元素為指標的陣列,本質為陣列。int p n 陣列指標 是指向陣列首元素的指標,其本質為指標。int p n 的優先順序高於指標運算子 操縱二維陣列 int a i j int pa j pa a a 代表該二維陣列的首位址 pa 代表該二維陣列的首位址 pa 也代表該二維陣列的首位...