二维数组
1.二维数组与二维数组的初始化
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符:数组名[常量表达式][常量表达式]。
二维数组行优先。
二维数组的初始化,代码1表示如下:
#include
int main()
{
int brr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int crr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d,%d\n",&crr[0][4],&crr[1][0]);
printf("%d\n",crr[1][5]);//10// 即crr[2][1]
int drr[3][4] = {1,2,3,4,5};
int err[3][4] = {0,0,0,0,0,0,0,0,0,1};
int frr[][4] = {1,2,3,4,5,6,7,8,9,10};
}
要验证二维数组是否可以转化为一维数组:
图1.
在代码1中运行printf("%d,%d\n",&crr[0][4],&crr[1][0]); 运行输出发现crr[0][4]与crr[1][0]地址相同,说明二维数组可以转化为一维数组。
2.二维数组与一位数组的比较
如图2所示
图2.
Ps:对于一些复杂的定义,判断它是指针是数组还是函数,我们可以通过以下来判断。
首先,通过优先级判断来确定它属性.
int (*p)[4] // ()的优先级大于[], 因此p先于*结合, (*p)是一个指针
int *p[4] // *的优先级小于[], 因此p先于[]结合, p[4]是一个数组
int (*p)() // ()两个优先级相同, 因此从左到右按顺序执行,(*p)是一个指针
int *p() // ()优先级高于*, 因此p先于()结合, p()是一个函数
然后,考虑:
如果是指针,则考虑指针指向的内容
如果是数组,则考虑数组的数据类型和长度
如果是函数,则考虑函数的参数列表和返回值
int (*p)[4] // 指向数组的指针(数组指针)
int *p[4] // 指向指针的数组(指针数组)
int (*p)() // 指向函数的指针(函数指针)
int *p() // 指向指针的函数 (指针函数)
3.二维数组的打印
#include
void Print(int (*arr)[4],int ra,int col)
{
for(int i=0; i