C語言——二維數組
阿新 • • 發佈:2018-10-30
不足 指向 變量 相同 形參 不能 int 一個個 main
二維數組
一、二維數組的定義
類型名 數組名[ 常量表達式1 ][ 常量表達式2 ]
int a[2][2]
二維數組可以看成是矩陣(或表格),常量表達式1可以看成矩陣(表格)的行數,常量表達式2可以看成矩陣(表格)的列數。
二維數組可以看成一個一維數組a[0],a[1],數組中的元素又是一個個一維數組a[0][0],a[0][1]和a[1][0],a[1][1]
在內存中,二維數組站一系列連續的存儲單元。存放的順序是“ 按行存放 ”
二、二維數組的初始化
1、賦初值個數與數組元素個數相同
int a[4][3] = {{1,2,3},{1,2,3},{1,2,3},{1,2,3}}
2、一行所賦初值個數與數組每行元素不同
系統自動給該行後面的元素補充初值0,但是不能跳過每行前面的元素給後面的元素賦初值
int a[4][3] = {{1,2,3},{1},{1,3},{1}}
// 等價於
int a[4][3] = {{1,2,3},{1,0,0},{1,3,0},{1,0,0}}
3、賦初值行數少於數組的行數
系統自動給不足行賦初值0
int a[4][3] = {{1,2,3},{1}}
// 等價於
int a[4][3] = {{1,2,3},{1,0,0},{0,0,0},{0,0,0}}
4、賦初值時省略花括號
系統按照元素在內存中排列的順序,將{}中的元素一一對應地賦給各個元素,若數據不足,後面的元素自動賦初值0
int a[4][3] = {1,2,3,4,5,6,7} // 等價於 int a[4][3] = {{1,2,3},{4,5,6},{7,0,0},{0,0,0}}
三、通過賦初值定義二維數組的大小
在一維數組中可以省略常量表達式,通過賦初值個數來確定數組的大小。
==> 二維數組也可以省略常量表達式,但是 只能省略常量表達式1
int a[][3] = {{1,2,3},{1},{2,3}}
// 等價於
int a[3][3] = {{1,2,3},{1},{2,3}}
int a[][3] = {1,2,3,4,5,6,7}
// 等價於
int a[3][3] = {{1,2,3},{4,5,6},{7,0,0}}
四、二維數組與指針
1、二維數組的名字
? 在二維數組中,數組名也是一個存放地址的指針,它的值是二維數組中第一個元素的地址。a與a[0]的值相 同,a+1與a[1]的值相同,a+2與a[2]的值相同,他們分別表示第一行、第二行、第三行的首地址。
? ===> 二維數組的名字是一個行指針,表示一行的首地址
2、二維數組元素的地址
// 三種方式等價
&a[i][j]
a[i]+j
*(a+i)+j
3、引用二維數組元素
- 通過地址引用二維數組元素
int a[3][4]
a[i][j] <==> *(a[i]+j) <==> *(*(a+i)+j)
- 通過建立指針數組引用二維數組元素
int *p[3],a[3][2]
*(p[i]+j) <==> *(*(p+i)+j) <==> (*(p+i))[j] <==> p[i][j]
- 通過建立一個行指針引用二維數組元素
int a[3][2],(*p)[2]
p[i][j] <==> *(p[i]+j) <==> *(*(p+i)+j) <==> (*(p+i))[j]
4、二維數組名與指針數組作為實參
二維數組名作為實參
當二維數組名作為實參時,形參必須是一個行指針變量
main(){
int s[M][N];
fun(s);
}
// 形參的三種書寫形式
fun(int (*a)[N])
fun(int a[][N])
fun(int a[M][N])
- 指針數組作為實參
當指針數組名作為實參時,形參必須是一個指向指針的指針
main(){
int s[M][N], *ps[M];
for(int i=0;i<M;i++)ps[i]=s[i];
func(ps)
}
// 形參的三種書寫形式
func(int *a[M])
func(int *a[])
func(int **a)
C語言——二維數組