嵌入式Linux系统学习记录8

在 C 语言中,二维数组多维数组是常用的数组类型,用来存储多个数据元素,下面详细介绍它们的细节和注意点。

1. 二维数组

二维数组是一个包含多个一维数组的数组,通常用来表示矩阵或表格。

定义和初始化

二维数组的定义方式如下:

int a[3][4]; // 声明一个3行4列的二维数组

  • a 是一个数组,包含 3 个元素,每个元素是一个包含 4 个整数的数组(即 3 行 4 列的矩阵)。

二维数组可以通过以下方式进行初始化:

int a[3][4] = { {1, 2, 3, 4}, // 第1行 {5, 6, 7, 8}, // 第2行 {9, 10, 11, 12} // 第3行 };

访问二维数组元素

二维数组元素可以通过双重索引来访问:

a[0][0] = 1; // 访问第1行第1列的元素 a[2][3] = 12; // 访问第3行第4列的元素

注意点
  1. 数组的存储方式: 二维数组在内存中是按行主序(row-major order)存储的,即数组的每一行是连续存储的。例如,数组 a[3][4] 存储的顺序是:

     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. 数组下标越界: 在访问二维数组时,务必确保索引不超出其范围。例如,对于 int a[3][4],合法的索引是 a[0][0]a[2][3],如果访问 a[3][4]a[4][5],会导致数组越界错误。

  3. 初始化: 如果你没有完全初始化二维数组,剩余的元素会被自动初始化为 0。例如:

    int a[3][4] = { {1, 2}, {3, 4}};

    会初始化为:

    a[0][0] = 1, a[0][1] = 2, a[0][2] = 0, a[0][3] = 0 a[1][0] = 3, a[1][1] = 4, a[1][2] = 0, a[1][3] = 0 a[2][0] = 0, a[2][1] = 0, a[2][2] = 0, a[2][3] = 0

2. 多维数组

多维数组是指数组的维度超过了 2。C 语言支持任意维度的数组,但通常使用较少的维度(例如三维、四维等)。

定义和初始化

定义三维数组的方式:

int a[3][4][5]; // 声明一个3x4x5的三维数组

  • a 是一个三维数组,包含 3 个二维数组,每个二维数组包含 4 行和 5 列。

三维数组初始化:

int a[3][4][5] = { { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}, {16, 17, 18, 19, 20} }, { {21, 22, 23, 24, 25}, {26, 27, 28, 29, 30}, {31, 32, 33, 34, 35}, {36, 37, 38, 39, 40} }, { {41, 42, 43, 44, 45}, {46, 47, 48, 49, 50}, {51, 52, 53, 54, 55}, {56, 57, 58, 59, 60} } };

访问多维数组元素

可以通过多重索引来访问多维数组的元素:

a[0][1][2] = 8; // 访问第1个二维数组,第2行,第3列的元素 a[2][3][4] = 60; // 访问第3个二维数组,第4行,第5列的元素

注意点
  1. 内存布局: 多维数组的存储也是行主序的。例如,三维数组 a[3][4][5] 在内存中的存储顺序是按 a[0][0][0]a[2][3][4] 依次存储。

  2. 维度越界: 访问数组元素时,确保各个维度的索引都在合法范围内。例如,int a[3][4][5] 的合法索引是 a[0][0][0]a[2][3][4]

  3. 多维数组的初始化: 如果没有完全初始化,C 会按顺序填充数组。如果多维数组的某个维度没有完全初始化,剩余部分会被初始化为 0。

总结

  • 二维数组是最常用的形式,适合存储矩阵或表格。
  • 多维数组可以扩展到更多维度,但需要注意数组的内存布局和索引越界问题。

在 C 语言中,函数是程序结构中的重要组成部分。函数的正确使用和理解是编写有效、可维护代码的关键。以下是关于 C 语言中函数的注意点和细节 的详细介绍:

1. 函数的定义与声明

定义

函数定义包括函数的返回类型、函数名、参数列表和函数体:

int add(int a, int b)

{ return a + b; }

  • int 是返回类型,表示该函数会返回一个整数值。
  • add 是函数名。
  • (int a, int b) 是函数参数,表示此函数需要两个整数作为输入。
  • { return a + b; } 是函数体,包含函数的实现。
声明

在 C 语言中,函数可以在使用之前进行声明(即函数原型)。函数声明是告诉编译器函数的返回类型、函数名以及参数类型,而不需要写出完整的函数实现。例如:

int add(int a, int b); // 函数声明

函数声明通常放在头文件或者主程序文件的前面。

2. 函数的调用

调用函数时,传入参数并接收返回值(如果有):

int result = add(5, 10); // 调用 add 函数并将返回值存储到 result 中

在调用时,实参会传递给函数的形参(形参是函数定义中声明的变量)。

3. 函数的参数传递

  • 值传递(pass by value):将实参的值复制给形参。函数内部对形参的修改不会影响实参。

    void func(int x) { x = 10; // 修改 x 不会影响实参 }

4. 函数的返回值

C 语言函数可以有一个返回值,表示函数的输出。返回值的类型在函数定义时指定:

int add(int a, int b) { return a + b; }

  • 如果函数需要返回某个值,使用 return 语句将值返回给调用者。
  • 如果函数没有返回值(即返回类型为 void),则没有 return 语句,或者仅用 return; 表示函数的结束:
      void print_hello()
  • { printf("Hello, world!\n"); }

5. 函数的作用域和生命周期

  • 局部变量: 在函数内部定义的变量称为局部变量,局部变量只在该函数的作用域内有效。当函数调用结束时,局部变量的生命周期结束,内存被释放。

    void func() { int x = 5; // x 是局部变量 }
  • 全局变量: 在函数外部定义的变量称为全局变量,可以在程序的任何地方访问。全局变量的生命周期从程序开始到程序结束。

    int x = 10; // 全局变量 void func() { printf("%d", x); // 访问全局变量 }

6. 函数重载与多态

C 语言不支持函数重载和多态(这些是 C++ 的特性)。在 C 中,函数名不能重复定义,即同一作用域内不能有多个同名函数。

总结

  • 函数定义包括返回类型、函数名、参数列表、函数体。
  • 函数调用是通过传递参数并获取返回值来进行的。
  • 作用域与生命周期:局部变量只在函数内部有效,而全局变量可以在程序的任何地方访问。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值