2025.11.04 C语言程序设计上机实习三
2025.11.04 C语言程序设计上机实习三
函数的基本定义与调用
程序的完整源代码
1 |
|
程序的实际运行输出
1 | s13665@ubuntu:~/codes/20251104$ gcc 1.c -lm |
程序流程图

参数传递与变量作用域
程序的完整源代码
1 |
|
- 值传递与地址传递的区别
- 值传递(如函数==ProcessData==和==UpdateValuesFail==):
- 函数接收的是实参的副本(即复制一份变量的值传入函数)。
- 函数内部对参数的修改仅作用于函数内的副本,不会影响外部原变量的值。
- 地址传递(如==UpdateValues==):
- 函数接收的是实参的内存地址(通过指针传递)。
- 函数内部通过指针解引用可以直接访问并修改原变量的内存空间,因此会影响外部原变量。
- 指针操作的实际效果
指针变量存储的是内存地址。
通过&变量名可以获取变量的地址(如&a表示变量 a 的内存地址)。
通过*指针名(解引用操作)可以访问指针指向的内存空间:
在UpdateValues中,*t1 += 5产生了如下效果:找到 t1 所指向的内存(即 a 的地址),将该地址中的值加 5,最终直接修改了原变量 a。
指针的核心作用是间接访问内存,实现函数对外部变量的修改,突破值传递 “仅操作副本” 的限制。
程序的实际运行输出
1 | s13665@ubuntu:~/codes/20251104$ ./a.out |
用Debug工具调试和分析代码的过程
设置断点
与上方所示代码相对应
1 | s13665@ubuntu:~/codes/20251104$ gdb a.out |
开始调试
执行run开始调试
打印a与a的地址
1 | (gdb) run |
执行 step 进入 ProcessData 函数,打印形参及形参的地址
1 | (gdb) step |
继续执行 continue,打印b与b的地址
1 | (gdb) continue |
执行 step 进入 ProcessData 函数,打印形参及形参的地址
1 | (gdb) step |
继续执行 continue,打印实参 a与a的地址 b与b的地址
1 | (gdb) continue |
执行 step 进入 UpdateValues 函数,打印形参及形参的地址
1 | (gdb) step |
继续执行 continue,打印实参 a与a的地址 b与b的地址
1 | (gdb) continue |
执行 step 进入 UpdateValuesFail 函数,打印形参及形参的地址
1 | (gdb) step |
为什么要打印这些值或地址?
验证值传递的特性:
- 对于
ProcessData和UpdateValuesFail,形参(num、t1、t2)是实参的副本,打印形参和实参的地址可证明两者存储在不同内存位置(地址不同),以此来证明函数内修改形参并不会影响实参。 - 打印值可验证形参初始值与实参一致(副本正确),但修改后形参与实参值不同,以此来说明“变量作用域”。
- 对于
验证地址传递的特性:
- 在函数
UpdateValues中,实参是&a和&b(地址),形参t1和t2是指针,打印形参t1、t2的值可证明它们确实指向实参a和b(t1 == &a,t2 == &b)。 - 结合后续对
*t1、*t2指针指向的内存的修改,可验证通过指针解引用能直接操作实参内存,以此来解释为何实参值会被函数修改。
- 在函数
理解函数调用时的参数传递机制:
- 值传递:实参值的副本给形参
- 地址传递:实参地址的副本给形参指针
程序的部分内存图及其解释

UpdateValues函数中t1、t2均为指针变量,存储实参a、b的地址。
UpdateValuesFail函数中t1、t2均为整型变量,先存储实参a、b原来的值,而后分别+5与+10,所得结果仍存储在形参t1、t2,并没有对实参a、b进行改变。
多函数协作与模块化设计
程序的完整源代码
1 |
|
程序的实际运行输出
1 | s13665@ubuntu:~/codes/20251104$ ./a.out |