c语言初级函数

void f(int x, int y)
{ int t
if(x<y)
{
t=x;x=y;y=t;
}
}
main()
{
int a=4,b=3,c=5;
f(a,b);f(a,c);f(b,c);
printf("%d,%d,%d\n"a,b,c)

}

最后的结果是4,3,5 验证过的
但是按照我的理解应该是5,4,3的
谁能给解释一下
!!!!!!详细的加分!!!!!!

对于函数,有两个概念要理解好
那就是实参和形参。
形参是在函数的原型里面的参数值,如下面函数原型
void inc(int a);
a就是形参,如果在使用的时候,给函数传递一个变量,如
int x = 5; //在这里x只是一个变量
inc(x);// 把他递给函数时,他就是函数运行时的一个参数,与a不同的是,x叫做实参,因为参与实际的运算。
而a只是表明一个变量,甚至上面的函数原型可以写为
void inc(int);//a没必要存在。
不过在实现这个函数时,就必须指明形参的名字,毕竟要操作他嘛。
void inc(int a)
{
a = a + 1;
}

上面讲了什么是形参,什么是实参。
形参是在定义函数原型,或者实现函数功能时用的,
而实参是在调用函数时使用的。

调用过程,会把x送给函数inc,但是这种说法很表面,具体说,应该是把x的值的大小送给inc。也就是函数的参数传递是传值的形式

我在main函数里定义了一个变量x,并初始化为5;
int x = 5;
如果调用inc(x),这样的调用不会改变变量x所对应的内存空间里面的数据,
这里用到传值,意思就是只是把x对应的值传给函数,而x对应的内容是不会变的。

要想改变x的内容,必须传递指向x的指针。
上面的函数可以改写成下面这个。
void inc(int *a) //这里的*用于定义a为一个指针,指向int类型
{
(*a) = (*a) + 1; //这里的*含义和上面的不同,表示使用地址a对应的值
}
调用时使用
inc(&x);// & 是取地址符
这样,就能改变x的值

下面是一个程序可以测试
#include <stdio.h>

void Inc1(int a);
void Inc2(int *a);

int main()
{
int x = 5;

Inc1(x);
printf("x的值为5,使用传值的函数后,x的值为:%d\n",x);
Inc2(&x);
printf("x的值为5,使用传地址的函数后,x的值为:%d\n",x);
return 0;
}

void Inc1(int a)
{
a = a + 1;
}
void Inc2(int *a)
{
*a = *a + 1;
}

解决办法:
上面的函数改写为
void f(int *x, int *y)
{ int t;
if(*x < *y) {
t=*x;*x=*y;*y=*t;
}
}
调用时使用
f(&a,&b);f(&a,&c);f(&b,&c); 即可。

不过对于指针的操作要小心,在C++里面使用了另外一种函数实参到形参的技术,叫做引用,可以很方面的实现这个功能,同时避免了指针操作带来的问题。

下面是c++的写法
#include <iostream>
using namespace std;
void f(int &x, int &y) //这个时候&不是取地址了,而是表示变量的引用
{ int t;
if(x<y)
{
t=x;x=y;y=t;
}
}
int main()
{
int a=4,b=3,c=5;
f(a,b);f(a,c);f(b,c);
cout<<a<<' '<<b<<' '<<c<<endl;
return 0;
}

建议,标准的c或者c++的程序都必须使用如下原型
int main()
{

}
至于要不要使用return关键字,去返回一些结果,看你程序的功能及结构,标准的是可以不return的,但是如果你是在VC环境下编程的话,不return会报错,我只能说微软太TMD。

我都是在linux用gcc的,比较符合标准。
以上程序,都在一个IDE下实现测试过
那个IDE的网址是www.codeblocks.org
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-10-02
你的f(int x,int y)x,y是形参,f(a,b)a,b是实参,实参的值复制到形参参与函数运算,因此对x,y的改变不会影响到实参。

用指针可以解决这点,指针不管怎么复制都表示唯一的内存地址,因此f函数应写为void f(int * x, int * y)
{ int t
if(*x<*y)
{
t=*x;*x=*y;*y=t;
}
}
同时main函数要取地址f(&a,&b);f(&a,&c);f(&b,&c);

如果是C++可以以用传引用方法:
void f(int & x, int & y)
{ int t
if(x<y)
{
t=x;x=y;y=t;
}
}
第2个回答  2008-10-02
void f(int &x, int &y)
{ int t ;
if(x<y)
{
t=x;x=y;y=t;
}
}

改成这样就好了 是函数参数传递的问题 我这正好有这方面的资料 呵呵

http://zhidao.baidu.com/question/70279771.html
第3个回答  2008-10-02
你的函数的参数是输入型参数,就是它的作用范围只是在本函数内部,当调用完函数之后,系统就会自动回收; 因此要使用输出型参数,也就是指针,使用指针 传递的是地址,函数的操作就相当比a,b,c的操作;

void f(int *x, int *y)
{ int t
if(*x<*y)
{
t=*x;*x=*y;*y=*t;
}
}

main()
{
int a=4,b=3,c=5;
f(&a,&b);f(&a,&c);f(&b,&c);
printf("%d,%d,%d\n"a,b,c)

}
第4个回答  2008-10-02
你的参数传递有问题,你是用传值法,这样在被调用的函数内部会开辟一个值的拷贝副本,而main()中的变量a,b,c的值是不会改变的。。。你可以使用传地址的方法来修改上述错误。
第5个回答  2008-10-02
形参的值只会在函数内部进行传递,而无法联系到函数外的变量值,用指针可以解决问题。
相似回答