什么是形参,实参?什么时候形参的数可以传到实参中?说个例子
3个回答
展开全部
时候使用的参数,目的是用来接收调用该函数时传如的参数.
实参:全称为"实际参数"是在调用时传递个该函数的参数.
形参和实参的类型必须要一致,或者要符合隐含转换规则,
当形参和实参不是指针类型时,在该函数运行时,形参和实
参是不同的变量,他们在内存中位于不同的位置,形参将实
参的内容复制一份,在该函数运行结束的时候形参被释放,
而实参内容不会改变.
而如果函数的参数是指针类型变量,在调用该函数的过程
中,传个函数的是实参的地址,在函数体内部使用的也是
实参的地址,即使用的就是实参本身.所以在函数体内部
可以改变实参的值.
给你一个很简单的例子:
int
f(int
b)
/*b为形参*/
main()
{int
a=1;
printf("%d",f(a));/*a为实参*/
}
这只是两个简单的抽象概念而已,用不着钻牛角尖。简单的讲,定义的是形参,调用的是实参。
明白了么?
实参:全称为"实际参数"是在调用时传递个该函数的参数.
形参和实参的类型必须要一致,或者要符合隐含转换规则,
当形参和实参不是指针类型时,在该函数运行时,形参和实
参是不同的变量,他们在内存中位于不同的位置,形参将实
参的内容复制一份,在该函数运行结束的时候形参被释放,
而实参内容不会改变.
而如果函数的参数是指针类型变量,在调用该函数的过程
中,传个函数的是实参的地址,在函数体内部使用的也是
实参的地址,即使用的就是实参本身.所以在函数体内部
可以改变实参的值.
给你一个很简单的例子:
int
f(int
b)
/*b为形参*/
main()
{int
a=1;
printf("%d",f(a));/*a为实参*/
}
这只是两个简单的抽象概念而已,用不着钻牛角尖。简单的讲,定义的是形参,调用的是实参。
明白了么?
展开全部
本质上因为实参传递的方式问题。不管是非引用const形参还是非引用形参,复制形参时并不考虑形参是否为const,因为形参只是实参的副本。在函数体内对形参的修改,都不会影响到实参,即实参的值没有改变。
一个例子:
#include<iostream>
using
namespace
std;
/*int
foo(int
i)
//
非引用形参
{
i
=
i
+
1;
//唯一的区别在这里,i非const形参,i可以为左值
return
i;
}*/
int
foo(const
int
i)
//
非引用const形参
{
//
i
=
i+1;
//const
形参,i不能使左值
return
i+1;
}
main()
{
int
i
=
1;
cout
<<
foo(i)
<<
"\t"<<
i
<<
endl;
//实参i的值都不会发生改变
//所以实参是不是const没有关系
}
一个例子:
#include<iostream>
using
namespace
std;
/*int
foo(int
i)
//
非引用形参
{
i
=
i
+
1;
//唯一的区别在这里,i非const形参,i可以为左值
return
i;
}*/
int
foo(const
int
i)
//
非引用const形参
{
//
i
=
i+1;
//const
形参,i不能使左值
return
i+1;
}
main()
{
int
i
=
1;
cout
<<
foo(i)
<<
"\t"<<
i
<<
endl;
//实参i的值都不会发生改变
//所以实参是不是const没有关系
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用数字来讲解能好些
假如
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具备改变数值功能的
假如
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具备改变数值功能的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询