C语言复习:函数调用与参数传递实例详解

需积分: 9 2 下载量 32 浏览量 更新于2024-09-15 收藏 50KB DOC 举报
在C语言的期末复习中,这部分题目主要涉及两个方面的内容:程序分析和函数参数传递的理解。 首先,针对第一部分的程序代码,这是一个名为`fun`的递归函数,用于演示静态变量`m`和累加操作。函数定义如下: ```c int fun(int x) { static int m = 3; // 静态变量,保持函数调用之间的状态 m++; // 自增操作 n += x; // 累加x到全局变量n printf("5: x=%d, m=%d, n=%d\n", x, m, n); // 打印变量值 return m + n; // 返回m与n的和 } 在`main`函数中,我们有以下步骤: 1. 声明和初始化变量x=2, y=3, n=1 2. 在第一个嵌套块中,x被局部重置为7,打印其值 3. 调用fun(x),此时x和y的值被传递给函数,由于x未改变,m和n会基于x=2进行累加 4. 再次调用fun(x),此时n已累加,所以输出x=2, m和n的新值 5. 又一次调用fun(x),结果同上,因为x和n值保持不变 6. 最后一次调用fun(x),输出结果与前两次相同 关于函数调用表达式中的实参和形参,第二部分的问题考察了传值调用和传址调用的区别: - (1) 对于`fun(x,y)`,实参x和y都是整型变量,传值调用意味着在函数内部对它们的值进行操作,原值不会改变。 - (2) 对于`fun(&x, &y)`,&运算符用于取地址,传址调用时,实参是变量的地址,函数内部对变量的修改会影响到主调函数的原始变量。 - (3) 字符类型的`x`和`y`在`fun(x,y)`调用中,也是传值调用,字符值会被复制。 - (4) 数组`a`作为实参`a[0]`,虽然是数组,但在传值调用时实际上是将数组的第一个元素(一个int类型)传递,数组本身不会改变。 - (5) 对于数组的指针`fun(&a[0])`或`fun(a)`,因为传递的是数组的首地址,所以是传址调用,改变函数内的数组元素会影响主调函数的数组。 - (6) `fun(a[2][2])`调用中,虽然传递的是二维数组的一个元素,但同样视为传值调用,只传递元素的值。 - (7) 对于字符串作为实参的情况,如`fun("string")`,虽然在C语言中字符串本质上是字符数组,但这里并未明确说明,但通常假设为传值调用,字符串常量在函数内部不改变。 总结来说,这部分题目主要测试学生对C语言基础语法、函数调用机制(传值/传址)、以及对数组和字符串处理的理解。复习时,确保掌握C语言的参数传递方式,理解静态变量的作用,并能分析程序的运行过程。