1. 程式人生 > >C語言——二維數組

C語言——二維數組

不足 指向 變量 相同 形參 不能 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語言——二維數組