嵌入式开发学习日志(二维数组、 字符数组、 函数入门) day9 持续更新中

嵌入式开发学习日志(二维数组、 字符数组、 函数入门) day9 持续更新中

一、二维整型数组

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. 函数的调用

格式:

函数名(实参表);

实参表:传递给函数的具体数据(常量、变量、表达式) 调用规则:

  1. 实参个数和形参个数必须一致

  2. 实参、形参数据类型一致,或者互相兼容

  3. 实参和形参名字可以相同,也可以不相同

  4. 函数不调用则不执行;调用几次,执行几次

返回值规则:

  • 有明确返回类型的函数,必须使用return;缺少 return 系统返回随机值

  • void类型函数,可以省略 return,也可以单独写return;

概念区分:

  • 主调函数:发起调用的函数(典型:main 函数)

  • 被调函数:被别人调用的函数

四、知识点总结速记

  1. 二维数组初始化:可省行数,不可省略列数,未赋值元素默认 0;

  2. 二维数组内存连续,先行后列依次存放;

  3. char arr[N][M]:N 代表字符串数量,M 代表单个字符串最大长度;

  4. 函数:模块化代码,减少重复代码,降低程序耦合性;

  5. 形参写在定义处,实参写在调用处,个数、类型必须匹配。