① c语言形参和实参,传值调用和引用调用的区别
int a(int x){//这个x就是形参,就是你定义的变量名称
.........
}
int main(){
int y=5;
a(y);//具体的变量y就是实参
a(z);//z也是实参,就是实实在在的值
}
#include<iostream>
usingnamespacestd;
voidswap(inta,intb)
{
inttemp;
temp=a;
a=b;
b=temp;
}
main()
{
inta=3,b=5;
cout<<"before‘swap’:a="<<a<<",b="<<b<<endl;
swap(a,b);
cout<<"after‘swap’:a="<<a<<",b="<<b<<endl;
}
这个例子是传值调用,意思就是形参的改变不会影响实参的值。
你运行一下可知主函数调用了swap函数后a,b的值并没有发生交换。
原因是,调用swap函数时编译器为swap(inta,intb)中的形参a,b单独分配内存空间,并接受主函数传递来的值,这块内存空间和main()函数中的a,b不是同一内存空间。所以在swap(inta,intb)中a,b发生了交换,但main函数中a,b没发生交换。即主调函数与被调函数的操作对象各不相同,参数仅在调用时由实参向形参传递,而不可由形参向实参传递。
要使a,b发生交换需要使用传址调用。程序改为如下:
#include<iostream>
usingnamespacestd;
voidswap(int&a,int&b)
{
inttemp;
temp=a;
a=b;
b=temp;
cout<<"in‘swap’:a="<<a<<",b="<<b<<endl;
}
main()
{
inta=3,b=5;
cout<<"before‘swap’:a="<<a<<",b="<<b<<endl;
swap(a,b);
cout<<"after‘swap’:a="<<a<<",b="<<b<<endl;
}
引用可以看作是一个变量的别名,使用引用时,对于voidswap(inta,intb)编译器并没有给形参a,b分配新的内存空间,只是使形参a,b指向了main函数中实参a,b的内存空间,他们共享同一内空间,即把地址给了形参。所以在voidswap(inta,intb)函数中对这块内存的改变也就改变了实参的值。
除了使用引用,也可以使用指针。
指针方式和引用方式都属于传址调用。
② C语言到底支不支持引用传递做函数参数
“引用传递做函数参数”是C++的特性,C语言不支持。
//C语言要这样写:
voidExchg3(Rect*x,Rect*y){/*...*/}
//然后传递指针:
Exchg3(&a,&b);
③ c语言中什么叫引用
引用(reference)是c++对c语言的重要扩充。引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*,例如: Point pt1(10,10)。
Point &pt2=pt1;,定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。
需要特别强调的是引用并不产生对象的副本,仅仅是对象的同义词,引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。
循环结构:
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do while循环和for循环。
四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误。
特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。
④ c语言支持引用型参数吗例如 int function(int &a)
支持引用传递。
而且用引用传递比用指针传递,程序的可读性更强一点,建议多用引用传递。
⑤ C语言中的值传参和引用传参是指什么
在C语言中其实没有引用传参,都是值传参。即传递的都是实参的副本。
如下示例,
//交换两个参数的值,值传参
void swap(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
int a = 2, b =1;
swap(a,b); //a,b的值不会改变,因为改变的是实参a,b的副本。
另一个示例:
//所谓的“引用传参”,交换两个数值
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = tem;
}
int a =2, b = 1;
swap(&a, &b);//a,b的值改变
其实这里引用传参,传递的也是参数的副本,只是这个副本是变量a,b的地址,所以你在函数swap中你并不能通过参数改变变量a,b的地址,因为它只是一个副本,是值传递。但你得到变量的地址,你就可以访问和改变变量的内容,所以在第二个swap函数中,你可以通过*x和*y来改变实参的值,从而可以达到交换变量a,b值的效果。但这并不是引用传递。只是有这样的说法。推荐你去秒秒学上看看相关的内容,我也是从那上面学来的。
⑥ C语言中如何将二维字符数组作为函数参数引用传递
不可能达到目的。因为C语言中没有引用这类型,C++才有。另,C/C++都不支持传递数组,只能传递数组的首元素或行指针,所以即使是C++,也只能传递数组指针的引用,而不可能传递数组的引用,因为数组没有引用。
⑦ 为什么在VC++6.0下用C语言调用引用参数如:void Creat(SqList &L)总是提示&出错
你好:
C 语言环境不提供这样的引用参数方式,只有 C++ 环境才有。
修改方法其实很简单:
第一步将参数中的 &L 变为 *L(赋地址调用方式),即 void Creat(Sqlist *L);
第二步将函数体内部的所有 L 变为 *L(L 为地址值,*L 取对应内存单元的内容)。
第三步将主调函数调用部分的变量加入取地址符 &,如 main() 函数体中的 Creat(&L);
引用函数的实质是赋地址调用,将其用赋地址调用的方法实现即可解决问题。
⑧ c语言中参数是什么概念
函数的参数分为形参和实参两种。
形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
形参和实参的功能是作数据传送,发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
举个例子:
定义一个函数s=f(a,b),功能是将a和b的差赋值给s,那么,a和b就是这个函数的两个参数。
(8)c语言引用型参数扩展阅读:
C语言的参数传递方式
方法有3种方式:值传递、地址传递、引用传递
tips:
被调用函数的形参只有函数被调用时才会临时分配存储单元,一旦调用结束占用的内存便会被释放
值传递和地址传递,传递的都是实参的一个拷贝
C语言中实参和形参之间的数据传递是单向的“值传递”,单向传递,只能由实参传给形参,反之不行
输出格式并没有选择%p而是选择了%d,因为十进制的数看起来更直观。
值传递
如果只是传递值的话:
#include <stdio.h>
//值传递传值
void swap( int x, int y);
int main()
{
int a=2,b=3;
printf("before:实参为a,b a=%d,地址为%d b=%d,地址为%d ",a,&a,b,&b);
swap(a,b);
printf("after:实参为a,b a=%d,地址为%d b=%d,地址为%d ",a,&a,b,&b);
return 0;
}
void swap(int x,int y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf("inside:形参为x,y x=%d,地址为%d y=%d,地址为%d ",x,&x,y,&y);
}
⑨ C语言 带参数函数的引用调用
#include <stdio.h>
void fun(int * a,int k);
void main()
{
int a[10];
printf("请输入10个整数:\n");
for(int i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
fun(a,sizeof(a)/sizeof(a[0]));
}
void fun(int a[],int k)//这就是你想要的函数
{
int g0=0,t0=0,e0=0;/*g0就是>0,t0就是小于0,e0就等0*/
for(int i=0;i<k;i++)
{
if(a[i]>0) g0++;
if(a[i]==0) e0++;
if(a[i]<0) t0++;
}
printf("大于0的个数为:%d\n",g0);
printf("小于0的个数为:%d\n",t0);
printf("等于0的个数为:%d\n",e0);
}
/*
说明就和ichenq的差不多,只是ichenq的那个有问题,比如他的if语句里多了几个";"号,导致无没通过,另外我用他的函数来测试得不到想要的结果
sizeof(a)/sizeof(a[0])就是数组a的长度*/
⑩ C语言形参和实参,传值调用和引用调用的区别
形参与实参:
int a(int x){//这个x就是形参,就是你定义的变量名称
......
}
int main(){
int y=5;
a(y);//具体的变量y就是实参
a(z);//z也是实参,就是实实在在的值
}
传值调用和引用调用:
二者的区别为,当传引用时,实际传到函数中的形参,是实际参数的一个引用,而不是仅传递值到函数中。具体的表现有以下几条:
1、传引用时,形参和实参是同一个变量,即使用相同的内存空间,二者有相同的地址。而传值时二者地址不同;
2、传引用时,由于没有新建变量,所以对于类对象参数,不会产生构造和析构。而如果是传值调用,调用时会进行构造,退出函数时会进行析构;
3、由于传引用使用的是原本实参的地址,所以对引用参数值的修改,会在退出函数后体现在主调函数中,而传值调用对参数的修改不会影响到主调函数。