函数概念
函数头:int get_sum(int a,int b)
函数体:
int :函数返回值类型
int a,int b:形参列表。
函数定义:defination。
函数调用:call
函数原型的声明declare:告诉编译器,有这么个函数,编译器就根据函数原型的声明,来测试函数调用是否正确。
关于函数:
1,函数原型的声明,告诉编译器,有这么个函数,编译器就根据函数原型的声明,来测试函数调用是否正确。
函数定义在上面,函数调用在下面,可以不用函数原型声明;
如果函数调用调用在上面,而函数定义在下面,则必须进行函数原型的声明。
2,函数返回值类型,函数运算完成后,返回的结果数值的类型,
调用者就可以根据返回值类型定义响应类型的变量,来接收函数的返回值。
函数的形参是函数被调用时,分配空间来接收实参的值。
函数体里定义的变量叫局部变量,保存函数中间运算结果的。
3,函数被调用时,分配栈帧,形参开辟空间接收实参的值,函数调用结束后,栈帧内存释放(形参
和局部变量的内存将全部自动释放),数据只能由实参传递给形参,不能由实参向形参传递,
是单向的。形参值的改变不会影响到实参。
4,必须按数目一样,类型一样,顺序一样的原则进行实参和形参结合。
5,{}是变量的作用范围,变量的作用范围就是定义处开始,到大括号结束,所以,不同的函数
可以使用相同的变量名,但他们是不同的内存单元。
关于函数调用
1. 传值调用(Call by Value): 在传值调用中,函数调用时,将实际参数的值复制给形式参数。在函数内部,对形式参数的任何修改都不会影响到实际参数。
特点:
- 实际参数的值被复制到形式参数,函数内部使用的是形式参数的副本。
- 在函数内部修改形式参数的值不会影响实际参数的值。
- 形式参数的修改只在函数内部生效。
优点:
- 简单和直观,易于理解。
- 避免了函数对实际参数造成的意外修改。
缺点:
- 如果参数较大,传递过程中需要复制整个参数的值,可能会占用大量内存和时间。
- 无法实现函数对实际参数的修改。
2. 地址调用(Call by Reference): 在地址调用中,函数调用时,将实际参数的地址传递给形式参数。函数内部使用的是实际参数的地址,对形式参数的任何修改都会影响到实际参数。
特点:
- 形式参数是实际参数的引用,它们指向同一个内存地址。
- 在函数内部对形式参数的修改会影响到实际参数的值。
- 引用调用可以实现函数对实际参数的修改。
优点:
- 无需复制大量数据,节省内存和时间开销。
- 函数可以直接修改实际参数的值。
缺点:
- 容易造成不经意的修改,导致程序的可预测性降低。
示例代码:
// 传值调用
void callByValue(int num) {
num += 10;
printf("值传递函数中 num: %d\n", num);
}
// 地址调用
void callByReference(int *num) {
*num += 10;
printf("址传递函数中 num: %d\n", *num);
}
int main() {
int num = 5;
printf("值传递前 num: %d\n", num);
callByValue(num);
printf("值传递后 num: %d\n", num);
printf("址传递前 num: %d\n", num);
callByReference(&num);
printf("址传递后 num: %d\n", num);
return 0;
}
输出结果:
值传递前 num: 5
值传递函数中num: 15
值传递后 num: 5
址传递前 num: 5
址传递函数中 num: 15
址传递后 num: 15
基础知识分享,本人水平有限,如有错误,请指正!