什么是形参,实参?什么时候形参的数可以传到实参中?说个例子

#include<stdio.h>
void point(char *p)
{
p+=3;
}
void f(char *x,char *y)
{
char t;
t=*x;*x=*y;*y=t;

}
main()
{
int i;
char b[4]={'a','b','c','d'},*p=b,*q;
point(p);
printf("%c\n",*p);
q=&b[3];
while(p<q)
{
f(p,q);
p++;q--;
}
for(i=0;i<4;i++)
printf("%c",b[i]);

}这个的结果为a回车dcba
为什么第一个的形参没有改变实参,而第二个改变了???

函数的定义和声明中的为形参,调用中的为实参,即实际参数,是程序在执行时参数。如果是传值调用,实参拷贝给形参,函数推出是形参的值自动销毁; 如果是传址调用,形参指针指向实参指针。形参和实参不一定字母相同。
第一个形参改变的只是它所在空间里的内容,函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
如果函数定义是指针,那么函数可以改变指针上储存的内容,但是不能改变指针本身。如果从这点考虑的话,实参是可以通过形参给改变的 。

来点实质性的吧,我把你的 "p+=3;"前加了个“*”号,结果为d,回车是dcbd
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-03
用数字来讲解能好些
假如 b[4]={'a','b','c','d'},内存给数组b分配地址从0x11开始(0x是十六进制),那么
&b[0]=0x11,&b[1]=0x12,&b[2]=0x13,&b[3]=0x14,
因为p=b,所以p=0x11.开始调用函数point(p);
这里先澄清一个概念,p在函数point定义和p在main中定义是不同的,虽然名字相同,但是
每个p只在函数中生存,函数结束,也跟着一起结束生命,他们之间无任何联系。
当调用函数point时,在main中的p将0x11复制到point中的p中,这样point中的p=0x11
p+=3,p=0x14,point中的p是0x14,但是main中的p仍就是0x11,那么对地址进行*运算,
取值仍然是'a'.如果这些都能理解,下面函数f(char *x,char *y)稍微增加对地址修改内容理解就行。
仍然是复制地址进去,但是对地址的值(*运算)发生变化,这样0x11-0x14地址没什么变化,
但是他们对应数值已经更改,所以函数f具备改变数值功能的追问

是不是说第一个子函数改变的是形参变量的地址所以不会改变实参,而第二个形参改变的是地址值所以说会改变实参呢?

追答

这里的实参都是指针,没有涉及改变。改变的是指针指向的具体数值。
第一个函数point中的p仅仅从最开始0x11变到0x14,由指向第一个元素变成指向第四个元素,但它没修改任何元素数值。而后面的函数f真正修改了地址上的内容。

本回答被提问者采纳
第2个回答  2011-03-04
时候使用的参数,目的是用来接收调用该函数时传如的参数.
实参:全称为"实际参数"是在调用时传递个该函数的参数.

形参和实参的类型必须要一致,或者要符合隐含转换规则,
当形参和实参不是指针类型时,在该函数运行时,形参和实
参是不同的变量,他们在内存中位于不同的位置,形参将实
参的内容复制一份,在该函数运行结束的时候形参被释放,
而实参内容不会改变.

而如果函数的参数是指针类型变量,在调用该函数的过程
中,传个函数的是实参的地址,在函数体内部使用的也是
实参的地址,即使用的就是实参本身.所以在函数体内部
可以改变实参的值.

给你一个很简单的例子:

int f(int b) /*b为形参*/

main()
{int a=1;
printf("%d",f(a));/*a为实参*/
}

这只是两个简单的抽象概念而已,用不着钻牛角尖。简单的讲,定义的是形参,调用的是实参。

明白了么?
第3个回答  2011-03-03
第二个用的是指针,第一个每有用指针,在一般情况下形参是不能改变实参的值的,在c语言中可以通过指针来改变实参的值。建议你先学一学函数。然后再学一学指针。谭浩强那本书讲得比较详细。追问

两个不都是用的指针吗?

相似回答