c语言学习小结(day12)

一、二维数组作为函数参数传递

在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. 标识符必须先定义才能使用。

  2. 同一作用域中不能定义同名标识符。

  3. 不同作用域(无包含关系)中可定义同名标识符,互不影响。

  4. 有包含关系的作用域中若重名,内层会屏蔽外层变量。


四、变量的生存期(生命周期)

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);
}

 注意:头文件中 只放声明,不放定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值