1. 向一个函数的参数传递二维数组的三种方法:
#include <stdio.h>
//
// 第一种传递方式(指针方式):int (*x)[20]
// 内部可以把x当成一个二维数组使用
//
void Fn1(int (*x)[20])
{
for (int i=0; i<10; i++)
{
for (int j=0; j<20; j++)
{
printf("%d ", x[i][j]);
}
printf("\n");
}
}
//
// 第二种传递方式(数组方式):int x[][20]
// 注意:形式参数的第一维允许为空
//
void Fn2(int x[][20])
{
for (int i=0; i<10; i++)
{
for (int j=0; j<20; j++)
{
printf("%d ", x[i][j]);
}
printf("\n");
}
}
//
// 第三种传递方式(单指针方式):int x[10][20]
// 内部x为当成一个一维数组使用,需要自己转换下标位置
//
void Fn3(int **x)
{
for (int i=0; i<10; i++)
{
for (int j=0; j<20; j++)
{
printf("%d ", x[i*20+j]);
}
printf("\n");
}
}
void main()
{
//定义实参(实参就是实际的准备向函数中传递的实际变量)
int xx[10][20];
//给实参附上初值
for (int i=0; i<10; i++)
{
for (int j=0; j<20; j++)
{
xx[i][j] = i+j;
}
}
//调用1——直观简单
Fn1(xx);
printf("\n");
//调用2——直观简单
Fn2(xx);
printf("\n");
//调用3——需要强制类型转换
Fn3((int **)xx);
}
2. 二维数组的初始化:
#include <stdio.h>
void main()
{
//
// 字符串1数组初始化
// 欲取得xx1个数(即下面的每周7天),使用:sizeof(xx1)/sizeof(xx1[0]
//
char xx1[][10]=
{
"MON", //!!注意不要忘记【逗号】,否则认为"MONTUE"为一个字符串,编译通过,无任何警告
"TUE",
"WED",
"THU",
"FRI",
"SAT",
"SUN", //<---最后一个【逗号】,可有可无
};
//printf("%d\n", sizeof(xx1)/sizeof(xx1[0]));
//
// 字符串2指针数组初始化特殊——可以使用下面的方式
// 注意:维数可以为空
//
char *xx2[]=
{
"MON", //!!注意不要忘记【逗号】,否则认为"MONTUE"为一个字符串,编译通过,无任何警告
"TUE",
"WED",
"THU",
"FRI",
"SAT",
"SUN", //<---最后一个【逗号】,可有可无
};
//
// 其他类型(这里用整型)的二维数组初始化
//
int xx3[][3]=
{
{11, 22, 33},
{10, 20, 30},
{12, 22, 32},
{15, 25, 35},
};
printf("%d\n", sizeof(xx3)/sizeof(xx3[0]));
//
// 但其他类型(这里用整型)的指针数组初始化错误!!
//
/*
int *xx4[]=
{
{11, 22, 33},
{10, 20, 30},
{12, 22, 32},
{15, 25, 35},
};
*/
//
// 但可以先“分开”定义,再使用分开定义的变量
//
int x1[] = {11, 22, 33};
int x2[] = {15, 22, 33};
int x3[] = {14, 22, 33};
int *xx4[]=
{
x1, x2, x3,
};
}