一、二维整型数组
1. 二维数组定义
格式:
类型说明符 数组名[行数][列数];
示例:
int a[3][4]; // 存储12个int数据 float b[3][4]; // 存储12个float数据
内存下标分布:
a[0][0] | a[0][1] | a[0][2] | a[0][3] |
a[1][0] | a[1][1] | a[1][2] | a[1][3] |
a[2][0] | a[2][1] | a[2][2] | a[2][3] |
2. 二维数组的访问
格式:
数组名[行下标][列下标];
行下标范围:
0 ~ 行数-1列下标范围:
0 ~ 列数-1
3. 二维数组的初始化
(1)全部初始化
int a[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; int a[][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
注意:在二维数组有初始化值情况下,可以省略行数,不能省略列数。
(2)局部初始化
int a[3][4] = {{1,2}, {5,6,7}, {9}}; int a[3][4] = {1,2,3,4,5,6,7,8}; int a[][4] = {1,2,3,4,5,6,7}; // 自动识别为2行4列
规则:未初始化数据按 0 存储。
(3)全部初始化为 0
int a[3][4] = {0}; int a[][4] = {0}; // 自动识别为1行4列
(4)sizeof 计算行列
int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; sizeof(a); // 总字节:6*4 = 24 sizeof(a[0][0]); // 单个元素字节:4 sizeof(a[0]); // 一行字节:4*3 = 12 // 计算行数 sizeof(a)/sizeof(a[0]); // 结果:2 // 计算列数 sizeof(a[0])/sizeof(a[0][0]); // 结果:3
4. 二维数组的存储方式
单一性:数组内数据类型统一(示例 int)
有序性:先行后列顺序存放
连续性:内存空间连续 存储排布顺序:
a[0][0] → a[0][1] → a[0][2] → a[0][3] → a[1][0] → a[1][1] → a[1][2] → a[1][3] → a[2][0] → a[2][1] → a[2][2] → a[2][3]
二、二维字符型数组
一维字符数组:保存一个字符串二维字符数组:保存多个字符串
1. 二维字符型数组定义
char 数组名[行数][列数];
示例:
char str[3][100]; // sizeof(str) → 3*100 = 300字节 // 可以存放:"hello world"、"how are you"、"xxxxxxx" 三组字符串
2. 二维字符型数组初始化
char str[3][100] = {0}; char str[3][100] = {{"hello"}, {"world"}, {"how"}}; char str[3][100] = {"hello", "world", "how"}; char str[3][100] = {"hello", "world"};
3. 二维字符型数组输入输出
输入示例:
char str[3][100] = {0}; for (int i = 0; i < 3; ++i) { gets(str[i]); }
输出示例:
for (int i = 0; i < 3; ++i) { puts(str[i]); //printf("%s\n", str[i]); }
补充提示:
gets()函数 C11 标准已废弃,仅作课堂学习参考,正式开发建议替换。
三、函数基础
1. 函数定义
格式:
返回值 函数名(形参表) { 函数体; }
返回值:支持 int、char 等基础类型、构造数据类型、
void返回值:函数最终运算结果
void空类型:函数执行完成不需要返回结果时使用
函数名:合法标识符,建议见名知意
例:strcpy(string copy)、get_max_val ();
形参表:函数执行需要用到的条件
书写形式:
数据类型 形参名, 数据类型 形参名, ...
2. 函数的调用
格式:
函数名(实参表);
实参表:传递给函数的具体数据(常量、变量、表达式) 调用规则:
实参个数和形参个数必须一致
实参、形参数据类型一致,或者互相兼容
实参和形参名字可以相同,也可以不相同
函数不调用则不执行;调用几次,执行几次
返回值规则:
有明确返回类型的函数,必须使用
return;缺少 return 系统返回随机值void类型函数,可以省略 return,也可以单独写return;
概念区分:
主调函数:发起调用的函数(典型:main 函数)
被调函数:被别人调用的函数
四、知识点总结速记
二维数组初始化:可省行数,不可省略列数,未赋值元素默认 0;
二维数组内存连续,先行后列依次存放;
char arr[N][M]:N 代表字符串数量,M 代表单个字符串最大长度;函数:模块化代码,减少重复代码,降低程序耦合性;
形参写在定义处,实参写在调用处,个数、类型必须匹配。