C語言 輕鬆理解二維陣列

2021-10-18 19:25:35 字數 3229 閱讀 8312

若有二維陣列a:

char a[10]

[10]=

;

則a表示二維陣列本身,含有100個元素,也可認為含有10個一維陣列,每個一維陣列含有10個元素,其占有100位元組;a[0]表示二維陣列a的第乙個一維陣列,含有10個元素,其占有10位元組;a[1]表示二維陣列a的第二個一維陣列,含有10個元素,其占有10位元組;a[0][0]表示二維陣列a的第乙個元素,同時也是一維陣列a[0]的第乙個元素,其占有1位元組;a[1][0]表示二維陣列a的第十乙個元素,同時也是一維陣列a[1]的第乙個元素,其占有1位元組。

/**

*二維陣列位址,行位址,元素位址及對應的位元組數(即這個位址標記的儲存片段大小)

*/printf(,

&a,sizeof

(a))

;printf(,

&a[0],

sizeof

(a[0])

);printf(,

&a[1],

sizeof

(a[1])

);printf(,

&a[0][

0],sizeof

(a[0][

0]))

;printf(,

&a[0][

1],sizeof

(a[0][

1]))

;[1]));

執行結果:

可以發現,a位址、a[0]位址和a[0][0]位址相同。其實,在c語言中,陣列的位址用其首元素的位址表示,故a[0]的位址就是a[0][0]的位址,a的位址就是a[0]的位址;且在c語言中,用a來表示二維陣列a的位址,用a[0]來表示二維陣列a的第乙個一維陣列a[0]的位址;同理,a[1]的位址等於a[1][0]的位址,用a[1]來表示二維陣列a的第二個一維陣列a[1]的位址。當然,雖然位址一樣,其意義並不一樣,如在前文中a的位元組數,a[0]的位元組數,a[0][0]的位元組數並不相同。

/**

*陣列的位址等於其首元素的位址

*/printf(,

&a,a)

;printf(,

&a[0

],a[0]

);printf(,

&a[1

],a[1]

);printf(,

&a[0][

0],a[0][

0]);

printf(,

&a[0][

1],a[0][

1]);

printf(,

&a[1][

0],a[1][

0]);

執行結果:

取位址運算子&的結果是乙個指標,占用固定位元組的儲存空間

/**

*取位址運算子的結果是乙個指標,占用固定位元組的儲存空間

*/printf

("&a值 :%p ; &a位元組數:%d\na值:%p ; a位元組數:%d\n\n"

,&a,

sizeof

(&a)

,a,sizeof

(a))

;

在陣列中靈活運用*運算子和運算子

/**

*靈活運用*運算子和運算子

*/printf

("*a值:%p ; *a位元組數:%d\n"

,*a,

sizeof

(*a));

printf

("a[0]值:%p ; a[0]位元組數:%d\n"

,a[0],

sizeof

(a[0])

);printf

("**a值:%d ; *a位元組數:%d\n",*

*a,sizeof(*

*a))

;printf

("a[0][0]值:%d ; a[0][0]位元組數:%d\n"

,a[0][

0],sizeof

(a[0][

0]))

;printf

("*a[0]值:%d ; *a[0]位元組數:%d\n\n"

,*a[0]

,sizeof

(*a[0]));

執行結果:

可以見到,*a沒到陣列元素維度,值是位址(一維陣列a[0]),**a到了陣列元素維度,值是儲存的資料。

位址運算的結果是指標。a+1指「一維陣列」a的第二個元素的位址(此時a中的元素被認為是一維陣列),即一維陣列a[1]的位址,其本身是乙個指標;*(a+1)等同於a[1];*(a+1)+1即元素a[1][1]的位址,其本身是乙個指標;*(*(a+1)+1)等同於a[1][1]。

/**

*位址運算的結果是指標

*/printf

(,a+1,

sizeof

(a+1),

&a[1])

;printf

("*(a+1)值:%p ; *(a+1)位元組數:%d\n",*

(a+1),

sizeof(*

(a+1))

);printf

("a[1]值:%p ; a[1]位元組數:%d\n"

,a[1],

sizeof

(a[1])

);printf(,

*(a+1)

+1,sizeof(*

(a+1)+

1),&a[1]

[1])

;printf

("*(*(a+1)+1)值:%d ; *(*(a+1)+1)位元組數:%d\n",*

(*(a+1)+

1),sizeof(*

(*(a+1)+

1)))

;printf

("a[1][1]值:%d ; a[1][1]位元組數:%d\n"

,a[1][

1],sizeof

(a[1][

1]))

;

執行結果:

C語言二維陣列深度理解

二維陣列比較抽象,比較難理解,他的原理是則呢麼樣的呢與一維陣列之間有什麼聯絡呢?定義乙個二維陣列 a 3 3 我對於二維陣列的理解就是 乙個一維陣列a 3 儲存了3個位址,這三個位址分別是這二維陣列的三行的首位址這樣 p 1 1 與p 1 1 相同也就說的通了 p指標指向陣列a 最近幾天我有思考了一...

C語言二維陣列專題 理解二維陣列名

int array 2 2 這個二維陣列裡包含了兩個一維陣列,分別是,這個好理解,但是對於array和array 1這兩種寫法,該怎麼理解呢?這篇文章我就說說我自己的心得吧。include 編譯器名 tdm gcc 4.9.2 32 bit release 執行平台 windows xp 32bit...

C語言二維陣列

int main int argc,const char argv int array 5 建立乙個二維陣列 型別修飾符陣列名 包含幾個小陣列 每個小陣列有多少個元素 初始值如何寫?int array 3 4 一維陣列可以省略元素個數,二維陣列只能省略第一位 第乙個 3 可以不寫 第二種初始值寫法 ...