一、二维数组作为函数参数传递
在C语言中,将二维数组作为函数参数传递时 必须指定列数,而 行数可以在函数中计算或不指定。例如:
void processArray(int arr[][4], int rows); // 列数4必须写明
主调函数中可以通过sizeof(arr) / sizeof(arr[0])
计算行数传递进去。
示例:求二维数组每一行的平均值
void rowAverages(int arr[][4], int rows)
{
for (int i = 0; i < rows; i++)
{
float sum = 0;
for (int j = 0; j < 4; j++)
{
sum += arr[i][j];
}
printf("第 %d 行平均值:%.2f\n", i + 1, sum / 4);
}
}
二、二维数组的镜像反转(水平翻转)
二维数组每一行的镜像反转实质是调用 一维数组逆序函数 实现的。
void reverseRow(int row[], int cols)
{
for (int i = 0; i < cols / 2; i++)
{
int temp = row[i];
row[i] = row[cols - 1 - i];
row[cols - 1 - i] = temp;
}
}
void mirror2D(int arr[][4], int rows)
{
for (int i = 0; i < rows; i++)
{
reverseRow(arr[i], 4);
}
}
三、标识符的作用域与可见性
1. 局部作用域
局部变量定义在函数或代码块内部。
存储在栈区(stack)。
生命周期仅限于所在作用域。
2. 全局作用域
全局变量定义在所有函数外部。
存储在全局区(data segment)。
未初始化的全局变量系统会自动按位清零。
可通过前缀 g_
命名规范区分全局变量,如 g_counter
。
3. 可见性规则
-
标识符必须先定义才能使用。
-
同一作用域中不能定义同名标识符。
-
不同作用域(无包含关系)中可定义同名标识符,互不影响。
-
有包含关系的作用域中若重名,内层会屏蔽外层变量。
四、变量的生存期(生命周期)
1. 静态生存期
生命周期与整个程序运行周期相同。
包括:
全局变量。
使用 static
修饰的局部变量。
static int s_i = 0; // 局部静态变量
static
作用:
限定函数/变量只在当前文件可见。
改变局部变量的生存期,使其静态化。
2. 动态生存期(自动变量)
使用 auto
(默认),在进入作用域时分配内存,离开后销毁。
使用 register
修饰可存放于CPU寄存器中,提高访问速度。
register int counter = 0;
// 注意:register变量不可取地址(&counter 是非法的)
五、Linux 中的常用编辑技巧(Vi/Vim)
:vsp 文件名
垂直分屏打开新文件
set mouse=a
开启鼠标支持,解除鼠标不能使用的问题。
六、函数声明与外部链接(extern
)
extern
用于声明在其他文件中定义的函数或变量。
// header.h
extern int sum(int a, int b); // 函数声明
// main.c
#include "header.h"
int main()
{
int result = sum(2, 3);
}
注意:头文件中 只放声明,不放定义。