廢話少說,先上自己dev c++上的**:
首先定義乙個2*3的二維陣列,定義乙個一維指標p和q,定義乙個指向指標的指標(*rp)[3],問題來了!#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;
}
第一種賦值方法:將二維陣列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
p是一維指標,初始位址為a[0][0],所以p+1的位址為a[0][1],q是二維指標,初始位址為a[0],所以q+1的位址為a[1][0],#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和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 也代表該二維陣列的首位...