Linux C语言第九天学习笔记:二维数组与函数
📌 今日学习内容概览
今天的学习从二维数组开始,延续到函数相关知识点,这是C语言从基础语法走向模块化编程的关键一步。
一、二维数组
1.1 二维整型数组
📖 定义格式
数据类型 数组名[行数][列数];示例:
inta[2][3];// 2行3列的二维数组⚠️注意:行数和列数必须为常量,不能使用变量。
🔍 元素访问
通过行下标和列下标访问每个元素,下标从0开始:
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]💾 存储方式
二维数组在内存中逐行从左到右连续存储,可以理解为一维数组构成的一维数组。
inta[2][3];// 存储顺序:a[0][0] → a[0][1] → a[0][2] → a[1][0] → a[1][1] → a[1][2]数组所占空间大小 = 数据类型大小 × 元素总个数(行数 × 列数)
📋 初始化方式
全部初始化:
inta[2][3]={1,2,3,4,5,6};inta[2][3]={{1,2,3},{4,5,6}};局部初始化:
inta[2][3]={1,2,3,4};// 剩余元素补0inta[2][3]={{1,2},{3}};// 每行剩余补0inta[2][3]={0};// 全部初始化为0默认初始化:
inta[][3]={1,2,3,4,5,6};// 行可省略,列不可省略1.2 二维字符型数组
🎯 功能
主要用于存储和操作多个字符串,即字符串数组。
📖 定义格式
char数组名[行数][列数];示例:
charstr[5][32];// 可以存储5个字符串,每个最长31个字符🔍 元素访问
str[0]// 访问第1行字符串(char[32]类型)str[0][2]// 访问第1行第3个字符(char类型)📋 初始化方式
// 方式1:逐个字符初始化charstr[5][32]={{'h','e','l','l','o','\0'},{'w','o','r','l','d','\0'}};// 方式2:字符串初始化(推荐)charstr[5][32]={{"hello"},{"world"},{"how"},{"are"},{"you"}};// 方式3:简化写法(最常用)charstr[5][32]={"hello","world","how","are","you"};// 全部初始化为0charstr[5][32]={0};二、函数
函数是C语言模块化编程的核心,能够避免代码重复,让程序结构更清晰。
2.1 函数的三种形式
① 函数的定义
函数类型 函数名(数据类型1形参1,数据类型2形参2,...){函数体;return返回值;}- 函数名:命名规则与变量相同
- 形参:形式参数,表示函数处理数据的方式
- 函数类型:返回值类型,默认为int;无返回值需写void
- 返回值:函数运行结果,类型需与函数类型一致
② 函数的调用
函数名(实参1,实参2,...);- 实参个数与形参个数必须一一对应
- 实参与形参类型不匹配时,会自动强制转换
③ 函数的声明
如果被调函数定义在主调函数之后,需要提前声明:
// 声明intadd(inta,intb);intmain(void){intsum=add(3,5);// 调用return0;}// 定义intadd(inta,intb){returna+b;}如果被调函数定义在主调函数之前,则无需声明。
2.2 变量的作用域与生存周期
| 类型 | 作用域 | 生存周期 |
|---|---|---|
| 局部变量 | 定义它的最近一对大括号内 | 执行到定义时开辟,超出作用域回收 |
| 全局变量 | 整个文件均可使用 | 程序开始到结束 |
2.3 变量的存储类型
存储类型 数据类型 变量名;| 存储类型 | 关键字 | 特点 |
|---|---|---|
| 自动型 | auto(默认) | 存储在栈区,未初始化随机值 |
| 寄存器型 | register | 存储在CPU寄存器,存取速度快 |
| 外部声明 | extern | 声明变量/函数在其他文件中定义 |
| 静态型 | static | 存储在静态区,未初始化默认为0,程序结束才回收 |
static 的特殊用途:
- 限制变量/函数作用域仅在当前文件,避免多文件编程时命名冲突
- 静态变量只初始化一次,多次调用保持上次的值
2.4 函数传参:值传递
C语言函数传参默认是值传递:
voidswap(inta,intb){inttmp=a;a=b;b=tmp;}intmain(void){intx=10,y=20;swap(x,y);printf("x = %d, y = %d\n",x,y);// 仍然是10, 20return0;}🔑核心理解:形参是实参的副本,修改形参不影响实参。
💡 今日学习心得
今天从二维数组过渡到函数,最大的感受是:
- 二维数组的存储逻辑——连续存储、逐行排列,这为理解指针和内存布局打下基础。
- 函数的模块化思想——将重复逻辑封装成函数,代码可读性和复用性大大提升。
- 值传递的本质——理解形参是实参的副本,对后续学习指针(地址传递)至关重要。
