二维数组定义:
类型说明符 数组名 [常量表达式][常量表达式];
第一个[常量表达式]表示“行”;第二个[常量表达式]表示“列”。
二维数组初始化:
int main()
{
int arr[2][3]={{1,2,3},{4,5,6,}};
int arr2[2][3]={1,2,3,4,5,6};
int arr3[2][3]={};//0
int arr4[2][3]={0};
int arr5[2][3];//随机值 0xcccccc烫烫烫
int arr6[][3]={1,2,3,4,5,6};
int arr2[2][]={1,2,3,4,5,6};//error 编译器不会确定列数
int arr7[2][3]={1,2,3};//部分初始化,其余的为零
int brr[2][3]=arr;//数组的初始化只有一次机会
return 0;
}
注:定义二维数组可以省略行数,但是不能省略列数。
C语言所有数组都是从零号下标开始的,先遍历行,再遍历列。
提问:下列代码表示什么意思?
/*
brr
brr+1
brr[0]+1
brr[0][0]+1
*/
int main()
{
int (*p)[3]=brr;
printf("%d\n",brr); //7339080
printf("%d\n",&brr); //7339080 首元素的首地址,brr代表首元素的首地址
printf("%d\n",&brr[0][0]);//7339080
printf("%d\n",brr+1); //7339092 下一行的首地址
printf("%d\n",brr[0]+1); //7339084 同一行的下一个地址
return 0;
}
注:
指向一维数组的指针,即数组指针(指向数组的指针,立起来的一维数组)
int(*p)[3]---->brr的类型,3代表列数
int *p[3]--->指针数组
在函数中二维数组作为参数的表达方式
void Show(int arr[2][3],int row,int col)
//row行的缩写,col列的缩写 arr[][3]也是可以的,列不可以省略
void Show(int (*arr)[3],int row,int col)
输出二维数组
void Show(int arr[2][3],int row,int col)//row行的缩写,col列的缩写 arr[][3]也是可以的,列不可以省略
{
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
int main()
{
int brr[2][3]={1,2,3,4,5,6};
Show(brr,2,3);
return 0;
}
第二种
void Show2(int *brr,int row,int col)
{
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
printf("%d ",brr[i*col+j]);
}
printf("\n");
}
}
int main()
{
int brr[2][3]={1,2,3,4,5,6};
Show2((int*)brr,2,3);
return 0;
}