首页 >> 精选问答 >

问C 语言函数调用实例分析 传值传参与执行流程详解

2026-11-05 08:42:00

答

C 语言函数调用就是在 main 函数或者其他函数内部,写出函数名并传入实参,让程序跳转到自定义函数内部执行代码,执行完成之后再回到原来调用位置继续运行,还可以通过 return 带回运算结果。学习函数调用实例分析的核心原因,是很多初学者分不清实参形参,不理解传值调用不会修改原始变量,也不清楚函数调用时程序跳转返回的完整执行顺序,通过多个实例拆解,可以掌握普通传值调用指针传参无返回值函数嵌套调用这几种最常用模式。整体思路是先理解函数声明定义调用三要素,再逐个实例跟踪代码执行流程,对比传值和传指针的差别,最后总结调用过程中的栈变化和常见错误。

一 函数调用基础概念

函数调用三部分

函数声明 提前告诉编译器函数名字 返回类型 参数类型,一般写在头文件或者 main 上方

函数定义 函数本体,写具体业务代码

函数调用 写函数名 括号里面填写实参,实参的数量类型顺序必须和形参匹配

核心术语

实参 调用的时候括号里面真实传入的数据,可以是常量 变量 表达式

形参 函数定义括号里面的变量,用来接收实参传进来的值

栈帧 每次函数调用,系统会在栈区开辟一块内存,保存形参 返回地址局部变量,函数执行结束栈帧销毁

二 实例 1 有返回值 传值调用 加法函数

完整代码

include

//函数定义

int add(int x,int y)

{

int z;

z = x + y;

return z;

}

int main()

{

int a = 10;

int b = 20;

int result;

result = add(a,b); //函数调用

printf("结果是%d\n",result);

return 0;

}

实例分析

第一步 main 执行到 result = add (a,b),把实参 a 的值 10 复制给形参 x,实参 b 的值 20 复制给形参 y

第二步 程序跳转到 add 函数内部执行,计算 z 等于 30

第三步 return z,把 30 返回回到 main 里面,赋值给 result 变量

第四步 继续执行 printf,输出结果是 30

重点结论 传值调用是值拷贝,形参 x y 是独立副本,在 add 内部修改 x y,不会影响 main 里面原始 a 和 b

三 实例 2 无返回值函数 void 类型

完整代码

include

void printInfo(int num)

{

printf("传入数字是%d\n",num);

}

int main()

{

int n = 99;

printInfo(n); //调用void函数

return 0;

}

实例分析

返回类型写 void,代表这个函数不需要 return 返回数值,函数执行完自动回到调用位置,不需要接收返回值,适合只做打印输出这类不需要带回结果的操作

四 实例 3 指针传参 可以修改外部原始变量

完整代码

include

void swap(int p1,int p2)

{

int temp;

temp = p1;

p1 = p2;

p2 = temp;

}

int main()

{

int a = 5;

int b = 8;

swap(&a,&b); //传入变量地址

printf("a=%d b=%d",a,b);

return 0;

}

实例分析

调用 swap 的时候传入 a 和 b 的内存地址,形参 p1 p2 接收地址,内部解引用操作的就是 main 里面原始变量内存,所以可以完成交换。这个实例是函数调用实例分析里面非常经典案例,用来对比传值调用无法交换变量的问题。

如果改成普通传值 swap (int p1,int p2),交换的只是副本,main 里面 a b 不会变化

五 实例 4 函数嵌套调用

完整代码

include

int square(int n)

{

return n n;

}

int sumSquare(int a,int b)

{

int s;

s = square(a) + square(b); //在函数里面调用另一个函数

return s;

}

int main()

{

int res = sumSquare(3,4);

printf("%d",res);

return 0;

}

实例分析

main 调用 sumSquare,sumSquare 内部又调用 square,程序执行顺序 main 进入 sumSquare,sumSquare 里面第一次调用 square,返回 9,第二次调用 square 返回 16,相加得到 25,返回 main 输出 25。多层调用栈依次压栈,内层函数执行完毕出栈,再回到上一层函数继续执行

六 传值调用和指针传参对比表

对比项传值调用指针传参
传递内容变量的值副本变量内存地址
是否修改原变量不能修改外部原始数据可以修改外部原始数据
内存开销大结构体拷贝开销高只传地址开销很小
形参类型普通数据类型指针类型

七 函数调用常见错误

1 实参个数和形参数量不匹配,编译报错

2 实参类型和形参类型不一致,出现隐式类型转换或者报错

3 函数没有提前声明,main 调用的时候编译器不识别函数

4 忘记 return,有返回值类型函数没有带回结果,返回值是随机垃圾值

5 指针传参传入空指针,函数内部解引用造成程序崩溃

【常见问题】

问题 1 C 语言函数调用实例分析里面,传值调用为什么不能修改 main 里面原始变量

回答 1 C 语言函数调用实例分析里面传值调用是拷贝一份独立形参副本,函数内部只操作副本内存,原始变量所在内存没有改动,所以不能修改外部原始变量,这是函数调用实例分析核心知识点。

问题 2 C 语言函数调用实例分析里面 swap 为什么一定要传指针

回答 1 C 语言函数调用实例分析经典 swap 案例,如果普通传值只能交换副本,传入指针拿到原始变量地址,解引用才能真正交换 main 里面两个变量,是函数调用实例分析必考案例。

问题 3 C 语言函数调用实例分析里面嵌套调用栈是怎么变化的

回答 1 C 语言函数调用实例分析里面,每调用一层函数栈帧压栈,内层函数执行 return 之后栈帧弹出,回到上一层函数继续运行,多层嵌套就是多层栈帧依次压栈出栈。

问题 4 C 语言函数调用实例分析里面 void 函数可以写 return 吗

回答 1 C 语言函数调用实例分析里面 void 函数可以单独写 return,作用是提前结束函数返回调用处,但是不能在 return 后面携带返回数值。

【免责申明】

本文基于标准 C 语言语法做函数调用实例分析,不同编译器栈布局细节会有差异,代码示例仅用于课程学习参考,实际项目请结合编译器手册,错误传参空指针造成程序异常由使用者自行承担风险。

 

相关阅读

最新文章