C语言数组与函数详解
第 10 章 数组
10.1 数组概述
数组的四大要素
- 数组名:标识符常量,需遵循命名规则。
- 元素:数组内所有元素的类型必须相同。
- 下标:从0开始的连续整数,用于访问元素。
- 长度:数组中元素的总个数。
C语言数组特性
- 内存中分配连续空间,大小由长度和元素类型决定。
- 元素在内存中紧密排列,保持原有顺序。
- 数组长度一旦确定(初始化后),则不可更改。元素值可以修改。
- 通过下标可快速直接访问任一元素。
注意:不允许给数组名重新赋值。
10.2 数组操作
10.2.1 数组定义与初始化
- 方式一(先声明后赋值):指定类型和长度,再通过下标赋值。
int arr1[5]; arr1[0] = 100; - 方式二(声明同时初始化):指定类型、长度并初始化。
double arr2[4] = {1.4, 2.5, 3.3, 4.9}; - 方式三(省略长度初始化):指定类型,省略长度,必须同时初始化。
short arr3[] = {10, 20, 30, 40, 50, 60, 70, 80};
10.2.2 访问数组元素
使用 `数组名[下标]` 进行访问。
10.2.3 数组越界访问
访问越界会导致读取到不确定的"垃圾值"。
10.2.4 计算数组长度
// 方法一
int length = sizeof(arr) / sizeof(arr[0]);
// 方法二
int length = sizeof(arr) / sizeof(int); // 假设数组元素为 int 类型
10.2.5 遍历数组
// 假设数组长度为 len
for (int i = 0; i < len; i++) {
// 访问数组元素 arr[i]
printf("%d ", arr[i]);
}
注意:C99标准支持使用变量表示数组长度,例如 `int nums[len];`。
10.3 字符数组(字符串)
10.3.1 字符串的本质
字符串本质上是 `char` 类型的一维数组,并在末尾自动添加一个空字符 `\0` 作为结束标记。
10.3.2 字符串定义
- 手动添加 `\0`:
char msg1[8] = {'B', 'e', 'i', 'j', 'i', 'n', 'g', '\0'}; - 自动添加 `\0`:
char msg2[9] = "Shanghai"; // 自动添加 \0,数组大小为9 - 简化写法(推荐):
char msg1[] = "Beijing"; // 编译器自动计算长度并添加 \0 char msg2[] = "Hello World"; // 编译器自动计算长度并添加 \0
10.3.3 字符串的访问与遍历
可以通过下标访问单个字符,并使用 `%s` 格式化符进行整体输出和遍历。
10.4 多维数组
10.4.1 二维数组定义与初始化
- 方式一(声明后赋值):
double arr1[3][2]; arr1[0][0] = 10.0; // ... - 方式二(声明同时初始化):
int arr2[2][3] = {{10, 20, 30}, {100, 200, 300}}; - 方式三(省略内层括号):
int arr3[3][4] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120}; - 方式四(省略行数):
int arr4[][4] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120};
10.4.2 二维数组访问与遍历
访问元素需使用 `数组名[行下标][列下标]`。遍历通常使用嵌套循环。
二维字符串示例(字符串数组):
char cities[3][10] = {"New York", "London", "Paris"};
for (int i = 0; i < 3; i++) {
printf("%s\n", cities[i]); // 使用 %s 打印整个字符串
}
第 11 章 函数
11.1 函数基本概念
函数是实现特定功能的代码块。分为库函数和自定义函数。
11.2 函数基本语法
11.2.1 函数声明(定义)
函数包含四要素:函数名、函数体(`{}` 中的代码)、返回值类型、参数列表(形参)。
注意:C语言不允许函数嵌套定义。
11.2.2 调用函数
使用 `函数名()` 进行调用。函数体内的代码仅在被调用时执行。函数调用的表达式的值即为函数的返回值。
11.2.3 返回值
- 有返回值:返回类型需与 `return` 语句后的表达式类型一致,否则会发生类型转换。
- 无返回值:函数返回类型声明为 `void`。函数体内可省略 `return` 语句,或使用 `return;` 结束函数。
- `return` 语句不仅能返回值,还能终止当前函数的执行。
11.2.4 参数
- 形参:函数声明时定义的参数,是函数内部的局部变量。
- 实参:函数调用时传递的参数,用于给形参赋值。实参与形参的数量必须一致。
注意:C语言函数参数传递是"值传递",即函数内部对形参的修改不会影响到外部实参。若要修改外部变量,需传递指针。
// 形参示例
void processData(int count) { // count 是形参
// 在函数内部可以访问和修改 count 的值
count = count * 2;
printf("Inside function: %d\n", count);
// 函数内部定义的局部变量
const double PI_VALUE = 3.14159;
char message[] = "Processing...";
printf("PI = %.5lf, Message = %s\n", PI_VALUE, message);
}
总结
- 数组:由四要素(名、元素类型、下标、长度)构成,提供连续内存空间,通过下标快速访问。
- 数组操作:包括定义、初始化、访问、越界处理、长度计算和遍历。
- 字符数组(字符串):以 `\0` 结尾的 `char` 数组,支持特殊格式化符 `%s`。
- 多维数组:用于表示行列结构等,通过多重下标访问,常用于二维字符串等场景。
- 函数:封装可重用代码块,有声明、定义、调用、返回值和参数等概念。参数传递默认是值传递。