重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
C语言中函数的参数传递(值传递,地址传递,引用传递)
成都创新互联公司专注于云阳企业网站建设,成都响应式网站建设公司,商城建设。云阳网站建设公司,为云阳等地区提供建站服务。全流程定制制作,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务
/* ^_^ 2015年11月3日09:58:03 辨析 C语言中函数的参数传递*/
//值传递 其实质是将数值传递给其他俩个变量,自己变量里面的值并没有改变----所以说是值传递。
# include stdio.h
void exchange();
int main (void)
{
int x,y;
x=3;
y=4;
exchange(x,y); //这就是典型的值传递,它把X,Y的值传递给变a和b;
printf("%d %d\n",x,y); //a,b的值进行交换,但是变量X,Y里面的值并没有交换。
return 0;
}
void exchange(int a,int b)
{
int temp;
temp =a;
a=b;
b=temp;
printf("%d %d\n",a,b);
}
//地址传递 (提到地址二字,应该始终明确,C语言中的地址是基于指针的,所以地址传递是一定会用指针的)
# include stdio.h
void exchange();
int main (void)
{
int x,y;
x=3;
y=4;
exchange(x,y); //这就是典型的地址传递,它把X,Y变量地址传递给指针a和b;
printf("%d %d\n",x,y); //*a,*b的值进行交换,就是找到a,b对应的地址交换地址里面的值,其实也就是
//找到 a,b值进行交换。
return 0;
}
void exchange(int *a,int*b)
{
int temp;
temp =*a;
*a=*b;
*b=temp;
printf("%d %d\n",*a,*b);
}
因为交换的并不是值,而是指针。而指针本身是传的值。意思就是在fun中虽然a指向了y,b指向了x但是a、b只是p和q的副本。如果要交换变量值应该用int c,*c=*a,*a=*b,*b=*c。
C语言中,所有的变量都存储在内存中,可以通过运算符获得变量的内存地址,函数调用时,只需要把普通变量前加上符号,就可以达到传递变量地址的目的。
例如:
定义一个结构体类型
struct Yearmonthday
{
int year, month, day;
};
定义相关函数,参数类型指定为结构体类型指针
void input(struct Yearmonthday *p1) //函数形参p1是结构体指针类型
{
printf("请输入年,月,日:");
scanf("%d,%d,%d",p1-year,p1-month,p1-day);
}
在主函数中定义一个结构体变量,调用相关函数,传递变量地址
int main()
{
struct Yearmonthday ymd;
input(ymd); //传递变量地址,以便带回数据
printf("date=%d/%d/%d\n", ymd.year, ymd.month, ymd.day ); //输出结果
return 0;
}
形参只是一个符号,不会分配具体的空间的..当函数被调用的时候,具体给出的参数,也就是实参,其实是一份拷贝..它的内存空间在该函数的堆中进行分配.比如 定义函数 int add(int ,int); 在主函数中 定义变量 int x, y..调用函数 add(x, y);那么在函数add的堆中会分配出空间,来保存实参x y的拷贝..而主函数中的 x y 是在主函数的堆中保存的... 不晓得有没有说明白..呵呵