二维数组常称为矩阵,其定义的一般形式为:
类型说明符 数组名 [常量表达式1][常量表达式2]
eg: int arr[3][4]表示为定义了一个3行4列的整型数组。
char brr[4][5]表示为定义了一个4行5列的字符型数组。
int crr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int drr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int err[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
写一个二维数组,使其按矩阵的方式输出;
# include <stdio.h>
int main()
{
int crr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for(int i=0;i<3;i++)//遍历行
{
for(int j=0;j<4;j++)//遍历列
{
printf("%-3d ",crr[i][j]);//-表示左对齐
}
printf("\n");
}
}
在二维数组中,只能省略最高为(常量表达式1),不能省略最低为(常量表达式2),即就有了行优先.
int crr[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//正确。
int crr[3][] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//错误
int crr[][] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//错误
那么,在形参中,怎么写二位数组呢?
先来看看一维数组和二维数组的比较:
一维数组 : 二位数组:(可以看成一个特殊的一维数组):
int arr[3] int brr[3][4](把一行数看成一个地址)
arr : int *型(表示首地址) brr int(*p)[4]
arr+1: int *型(表示指针+1) brr+1 int(*p)[4]
arr[0]: int型(表示首地址元素 ) brr[0] brr[0]==arr(表示首地址)= int *型
brr[0]+1 int *
brr[0][0] int型(表示首地址元素)
那么在形参中,定义二位数组arr[3][4]=>int(*arr)[4](指向数组的指针,即为数组指针)
注意:int(*arr)[4]与int*arr[4]两个意思不一样,应为优先级不一样:
int(*arr)[4]:指向数组的指针,即为数组指针。
int*arr[4] :保存指针的数组,即为指针数组。
用函数的方法,输出二维数组。
# include<stdio.h>
//void Show( int **arr)//error,
void Show(int (*err)[4],int row,int col)
{
for(int i=0;i<row;i++)//遍历行
{
for(int j=0;j<col;j++)//遍历列
{
printf("%-3d ",arr[i][j]);//-表示左对齐
}
printf("\n");
}
}
int main()
{
int err[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12};
Show(err,3,4);
return 0;
}
谨记,二维数组和二级指针不是同一概念,切勿搞混淆