C语言形参和实参的陷阱
来源:互联网 发布:c语言求5个数平均值 编辑:程序博客网 时间:2024/05/23 00:02
下面用一个小程序来进行说明:
#include <stdio.h>
void main()
{
void sort(int x,int y,int z);
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
sort(a,b,c);
printf("%d %d %d\n",a,b,c);//输出结果顺序不变
}
void sort(int x,int y,int z)
{
int t1;
if(x>y)
{
t1=x;
x=y;
y=t1;
}
if(x>z)
{
t1=x;
x=z;
z=t1;
}
if(y>z)
{
t1=y;
y=z;
z=t1;
}
printf("%d %d %d\n",x,y,z); //输出顺序改变
}
在主函数中printf("%d %d %d\n",a,b,c);的结果之所以不变,是因为实参向对形参的数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数的实参的值。
当用指针来处理的时候,可以避免这个问题
#include <stdio.h>
void sort(int *x,int *y,int *z);
main()
{
int a,b,c;
printf("请输入三个整数:\n");
scanf("%d %d %d",&a,&b,&c);
sort(&a,&b,&c);
printf("small to big: %d %d %d\n",a,b,c);
}
void sort(int *x,int *y,int *z)
{
int t;
if (*x>*y)
{
t=*x;
*x=*y;
*y=t;
}
if(*x>*z)
{
t=*z;
*z=*x;
*x=t;
}
if(*y>*z)
{
t=*y;
*y=*z;
*z=t;
}
}
- C语言形参和实参的陷阱
- C语言的形参和实参个数不一致问题
- 8.3 C语言函数的形参和实参
- C语言形参和实参的收录
- C语言中的形参和实参
- 关于C语言形参和实参
- C语言形参和实参
- 形参和实参的联系及陷阱
- c语言中形参和实参的区别
- c语言中形参和实参的关系
- c语言中形参和实参的区别?
- C语言学习笔记(2)形参和实参
- c++--实参和形参
- C语言中的形参和实参的定义是什么?有什么区别?
- 黑马程序员------C语言中对形参和实参的理解
- C语言中实参和形参问题&&函数使用数组作为参数的问题
- 交换两个整数(形参和实参的用法) —— C语言
- C语言基础 实参与形参的类型一致
- 时隔两年,又回来做技术了
- Model Dialog with free JQuery User Interface
- v4l2 spec 中文 Ch01
- timer定时器
- sbr": No such file or directory 问题小记
- C语言形参和实参的陷阱
- js Date 对象用于处理日期和时间
- ubuntu10.04 下 nginx1.0.3安装出错记录
- Android提高十六篇之使用NDK把彩图转换灰度图
- css语法(转自“清清月儿”)
- 2011 江苏考生文化课304 选修CC 在江苏志愿参考
- CSS定位 (转自”清清月儿“)
- Android提高十七篇之多级树形菜单的实现
- zoj 1542 【Kruskal算法】