c语言中形参与实参的关系是:形参是实参的值副本。无论参数的类型是什么,传递到子函数中的形参只是实参的值。所以,在改变形参变量自身的值时,是与实参无关的。换句话说,形参的改变不会影响到实参。
在旅顺口等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都做网站、网站设计 网站设计制作按需网站开发,公司网站建设,企业网站建设,品牌网站设计,全网营销推广,成都外贸网站建设公司,旅顺口网站建设费用合理。
但,如果参数类型是指针类型,则可以通过对指针变量所指向的地址中的数据进行修改,达到改变实参地址中的数据目的。
因此,使用swap函数进行数据交换时,必须保证两点:
1.
参数必须是指针类型,指向待交换的数据
2.
交换时,必须交换地址中的数据,而不是交换地址本身。
参考代码:
//错误的交换代码1
void swap1( int a, int b ) //参数不是待交换数据的指针
{
int t=a;
a=b;
b=t;
}
//错误的交换代码2
void swap2( int *a, int *b )
{
int *t=a;//交换形参变量本身
a=b;
b=t;
}
//正确的交换代码
void swap( int *a, int *b )
{
int t=*a;//交换形参变量地址中的数据,指针变量不变
*a=*b;
*b=t;
}
有以下区别:
1、主体不同:实参在调用有参函数时,函数名后面括号中的参数为“实际参数”。形参不是实际存在变量,又称虚拟变量。
2、目的不同:实参可以是常量、变量或表达式,无论实参是何种类型的量,在进行函数调用时,都必须具有确定的值,以便把这些值传送给形参。
需要注意当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。
指针可以作实参。但你那样写是错误的,因为int
*a=NULL;的意思是指针a不可作右值使用,而后面的A(a);恰恰是把a当右值使用了。这样写就可以,如:int
x,*a=x;A(a);或int
y[10],*a=y;A(a);等等……
第一个问题:
形参是指针,实参就应该是对应数据类型的地址。
例如:
swap(int *x,int *y)
{
int t ;
t = *x;
*x = *y;
*y = t;
}
int main()
{
int a = 2,b=6;
swap(a,b);
//因为swap函数的形参是int类型的指针,所以传入的实参应该是int类型变量的地址
return 0;
}
第二个问题:
当实参是指针的时候,形参应该是什么?
其实很简单,你只要把
第一问列出来 ①实参:地址 ②形参 :指针
一一对应出来 ①实参:指针 ②形参:指针的指针
因为你要在局部函数中改变实参,就需要传递它的地址,指针也是如此,把它类比为int型变量就好了。
个人理解,希望能帮到你,如有不对,欢迎指正
举例:
void f(int *p)
{
}
int arr[]={1,2,3};
因为函数f的形参是一个类型为int的指针变量,所以调用f时,可以将数组名arr作为实参传给形参p。即可以这样调用:f(arr);
顾名思义,形参只是为了塑造一个函数的外形.比如max(x,y),这里x和y我们叫它形参.而我们有两个数a=10,b=8,把a和b赋值给max函数的话,就可以比较a和b的最大值,那么a,b在这里就叫做实参,是实际输入的值.
你自己复制的不是很清楚吗,解释的很好.