如何理解一維指標陣列指向二維指標

時間 2021-06-06 10:54:54

1樓:szouc

兩個重要的基本概念偶爾會在教材中被忽視。

1.陣列名出現在表示式中會隱式轉換成指向該陣列第乙個元素的常量指標。特殊情況暫忽略。

2.解引用 * 運算子與下標 運算子等價,a[3] <=> *(a+3),c[2][4] <=> *(c[2]+4) <=> *(*(c+2)+4)。

題目中 int *c[4] 是指標陣列,當陣列名 c 出現在表示式中,根據 1 轉化為常量指標。因此 c = a 語法錯誤,因為 c 是常量非左值不能出現在賦值運算子左側。猜測你的意思是 c[0] = a[0],c[1] = a[1],...

,這是題目中提到的指標陣列儲存二維陣列每行位址。

繼續根據 1 可知表示式中 c 是指標且指向陣列首個元素,而該陣列是指標陣列,因此表示式中的 c 是指向指標的指標,等同於 int **q。q 是普通指標,題目中可以改成 q = a ,但是 q 和 a 型別不一致會強制轉換,a 根據 1 知其型別是指向陣列的指標,即 int(*)[4]。

最後就是如何通過二級指標或指標陣列訪問二維陣列元素,參考 2 就應該明白吧。這裡注意二級指標剛才強制轉化丟失了行資訊,需要轉化回來,所以很少這麼幹,老老實實使用陣列指標。

int main(void)

; int **q;

int *c[4];

c[0] = a[0];

q = a;

printf("%d\n", a[0][2]);

printf("%d\n", c[0][2]);

printf("%d\n", *(*((int(*)[4])q+0))+2);}

2樓:李廣勝

別把指標想的太複雜,指標就是乙個變數,這個變數的內容是記憶體位址。

也別把什麼二維三維N維想的太繞了,其實一整片記憶體。指標的使用就是乙個計算記憶體位址的行為。

雖然宣告的是a[3][4],但是實際上和宣告a[12]效果一樣。

C語言是弱型別語言,一維型別或者二維型別或者N維型別都是可以互相轉換的,影響的只是計算實際位址的方式而已。

a[7], *(a+7), 甚至7[a]都可以取到相同的值int (*p)[3] = (int(*)[3])(a); 指標轉換成二維以後,p[0][7], p[1][4], p[2][1],甚至p[10000][-29993]取值的位址也是一樣的。

#include

intmain();

int(*p

)[3]=

(int(*

)[3])(a

);printf

("%d %d %d %d %d %d %d %d %d\n"

,a[7

],7[a

],*(a

+7),p

[0][7

],p[1

][4],p

[2][1

],p[3

][-2],

p[4][

-5],p

[10000][-

29993]);}

C語言指標 二維陣列,為啥會這樣?

沒明白你不理解的點在哪,我猜是單純糾結於為什麼要寫成0 COLS 0而不直接寫0。答案是直接寫0也可以,其實是為了統一下格式,就是乘號,結果上和直接寫0沒區別。int a 0 COLS 0 int a 1 COLS 2 int a 3 COLS 2 統一成這種格式而已。沒啥講究的,還是 指標 破數字...

2021 03 20 給定乙個二維陣列matrix,其中的值不是0就是1,返回全部由 如何解答呢?

mathe 我們可以先考慮計算每個1它左邊包含自身連續的1的數目 如果它本身為0,那麼計數也設定為0 比如對於矩陣 0110111 1100011 1110011 0111100 計數結果為 0120123 1200012 1230012 0123400 然後依次分析每一列 比如第一列有兩個連續的1...

c語言指標二維陣列a中,a和a 0 的值不應該是一樣的嗎?為什麼會出現以下問題?

給你把各個型別的關係理清就懂了。首先說a,假設a是乙個5個元素的int陣列,那麼a的型別是int 5 是陣列型別,其元素為int,有5個元素長。然後關於a 1這個表示式,由於陣列型別本身是不可變的,也不可 1,但是c語言規定了一條規則,那就是陣列型別可以隱式轉換成其首元素的指標,結果型別是int i...