C语言中的形参&实参
变量:
当你声明一个变量时候,系统会给你分配一块内存,这个内存也会有一个地址;
不论是全局变量还是局部变量,作用域和生命周期可能不一样外,只有类型的不一样,别基本属性是一样的,就是一个变量;
也没有所谓的指针变量,只是这个变量的类型是个指针而已,他也是分配一块内存,有自己的地址,长度是int,只是他的数据是某块的地址;
所以你要是想通过参数修改数据,只能传入该变量的地址,然函数体取到对应的地址,对地质内的数据操作,如果只传入变量,相当于就是函数体的局部变量,作用域在该函数体内,函数体结束时,生命周期结束;
//一下是网络收集的资料辅助理解;
记住这条基本原理:形参相当于函数中定义的变量,调用函数传递参数的过程相当于定义形参变量并且用实参的值来初始化。例如这样调用:
void print_time(int hour, int minute) { printf("%d:%d\n", hour, minute); } int main(void) { int h = 23, m = 59; print_time(h, m); return 0; }
相当于在函数print_time中执行了这样一些语句:
int hour = h; int minute = m; printf("%d:%d\n", hour, minute);
main函数的变量h和print_time函数的参数hour是两个不同的变量,只不过它们的存储空间中都保存了相同的值23,因为变量h的值赋给了参数hour。同理,变量m的值赋给了参数minute。C语言的这种传递参数的方式称为Call by Value。在调用函数时,每个参数都需要得到一个值,函数定义中有几个形参,在调用时就要传几个实参,不能多也不能少,每个参数的类型也必须对应上。
在定义函数中指定的形参,在未出现函数调用时,他们并不占内存中的存储单元。只有在发生函数调用时,函数max中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。
实参可以是常量、变量和表达式,但要求有确定的值。在调用时将实参的值赋给形参。
在C语言中,实参向形参的数据传递是值传递,单向传递,只由实参传给形参,而不能由形参传给实参。在内存中,实参单元和形参单元是不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留原值。
指针变量作函数参数也要遵循这一规则。不可能通过调用函数来改变实参变量的值,但可以改变实参指针变量所指变量的值。
函数的形参和实参具有以下特点:
1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。
2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。
4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
#include <stdio.h>
#include <string.h>
void swap_a(int a ,int b)
{
a ^= b;
b^= a;
a^=b;
}
void swap(int *a,int*b)
{
*a = 20;
*b = 10;
}
int main()
{
int a=10 ;
int b = 20;
int x = 10;
int y = 20;
swap_a(x,y);
swap(&a,&b);//
printf("a:%d,b:%d,x:%d,y:%d",a,b,x,y);
getchar();
return 0;
}
结果:a:20,b:10,x:10,y:20
分析:swap(x,y)形式参数,可以理解为该函数的局部变量,调用结束内存释放,实参可以传递给形参,形参不可以传递给实参;
swap(&a,&b);实参为地址,*a = 20;*b =10;该函数处理的是地址,即使子函数释放所有内存,地址上的值已经变化,所以可以传出来,,
以上案例,是自己总结