C语言数组与函数核心知识总结
第一部分:数组
数组是一种存储多个相同类型元素的集合,是C语言中最重要的数据结构之一。
. 一维数组
创建:type arr_name[常量值];
例如:int math[20];用于存储20个整数。
初始化:创建时给定初始值。
完全初始化:
int arr[5] = {1, 2, 3, 4, 5};不完全初始化:剩余元素自动初始化为0。
int arr2[6] = {1};省略大小:数组初始化时可省略大小,编译器自动计算。
int arr[] = {1,2,3};
使用:通过下标访问元素,下标从0开始。
访问:
arr[7]遍历:通过
for循环配合下标遍历所有元素。
内存存储:数组元素在内存中连续存储。通过打印地址可以发现,相邻元素地址差等于单个元素类型大小(如整型差4字节)。
计算元素个数:使用
sizeof操作符。sizeof(arr):计算数组总字节大小。sizeof(arr) / sizeof(arr[0]):计算数组元素个数。这是一个常用技巧,可提高代码适应性。2. 二维数组
概念:一维数组作为元素构成的数组,可理解为矩阵。
创建:
type arr_name[行数][列数];例如:
int arr[3][5];创建一个3行5列的整型数组。
初始化:
按行完全初始化:
int arr[3][5] = {{1,2}, {3,4}, {5,6}};按顺序初始化:
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};省略行,不可省略列:
int arr[][5] = {1,2,3,4,5,6,7};编译器会自动推算行数。
使用:通过行下标和列下标访问元素,均从0开始。
访问:
arr[2][4]遍历:使用双层嵌套
for循环。
3. 变长数组(C99)
概念:数组长度可以用变量指定,在运行时确定。
语法:
int arr[n];(n为变量)。限制:不能初始化,且并非所有编译器完全支持(如VS2022不支持,但gcc支持)。
4. 练习案例
二分查找:在升序数组中高效查找指定值。通过定义左(
left)、右(right)边界和中间(mid)下标,每次比较后缩小一半搜索范围。内存存储:二维数组在内存中同样连续存储,按行顺序排列。
arr[0][4]与arr[1][0]地址相邻。第二部分:函数
函数是完成特定任务的一段代码,是C程序的基本模块,支持代码复用和模块化。
1. 函数分类
库函数:由C语言标准库或编译器厂商提供,如
printf,scanf,sqrt。使用前需包含对应头文件(如#include <stdio.h>)。自定义函数:程序员根据需要自己编写的函数。
返回类型 函数名(参数列表) {
// 函数体
return 返回值; // 可选
}形参(形式参数):定义函数时括号中的变量,用于接收值。
实参(实际参数):调用函数时传递给函数的具体值。
3. 数组作为函数参数
传递方式:将数组名作为参数传递。
关键特性:
形参接收数组时,可写成数组形式,如
int arr[]。一维数组形参,数组大小可以省略。
二维数组形参,行可以省略,但列不能省略,如
int arr[][5]。**最重要的一点:数组传参时,形参不会创建新数组,形参操作的数组与实参数组是同一块内存空间。因此函数内对数组元素的修改会影响原数组。
关键点:形参是实参的一份临时拷贝,两者占用不同的内存空间。
4. 函数调用方式
嵌套调用:函数之间互相调用,例如函数A内部调用函数B。
链式访问:将一个函数的返回值作为另一个函数的参数,如
printf("%d\n", strlen("abc"));。5. 函数的声明与定义
声明:告诉编译器函数的名字、参数和返回类型。写在调用之前,通常放在头文件(
.h)中。格式:int Add(int, int);或int Add(int x, int y);定义:函数的具体实现。通常放在源文件(
.c)中。原则:函数需先声明后使用。将定义放在调用之前,等价于声明+定义。
代码的拆分好处
1.一定程度上隐藏代码
2.方便多人协作
3.代码模块化
创建静态库.lib.隐藏代码
6. 作用域、生命周期与
static、extern关键字static关键字:修饰局部变量:改变其存储位置(从栈区到静态区),从而改变生命周期(使其在程序运行期间一直存在),但不改变作用域。常用于函数调用间保留状态。
修饰全局变量/函数:改变其链接属性(从外部链接变为内部链接),使其作用域限制在本源文件内部,无法被其他源文件通过
extern声明使用。用于隐藏实现细节。
extern关键字:用于声明在其他源文件中定义的全局变量或函数,表示“此标识符定义在外”。作用域:变量/标识符的有效代码范围。
局部变量:所在局部范围(如函数内)。
全局变量:整个工程。
生命周期:变量从创建到销毁的时间段。
局部变量:进入作用域开始,离开作用域结束。
全局变量:整个程序运行期间。
核心关联与编程思想
数据与操作的结合:数组是组织数据的强大容器,而函数是对这些数据进行操作的模块。二者结合是构建复杂程序的基础。
模块化与封装:函数将特定功能封装,使主程序逻辑清晰。
static关键字能进一步加强模块的封装性,隐藏内部数据与函数。效率与复用:通过函数复用代码,通过数组高效存储和管理批量同类数据。二分查找算法是数组与逻辑结合提升性能的典范。
内存视角理解:理解数组的连续存储和函数参数传递的值拷贝(普通变量)与地址关联(数组)机制,是深入理解C语言内存操作的关键。
