重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
值传递。
成都创新互联基于成都重庆香港及美国等地区分布式IDC机房数据中心构建的电信大带宽,联通大带宽,移动大带宽,多线BGP大带宽租用,是为众多客户提供专业服务器托管报价,主机托管价格性价比高,为金融证券行业达州电信机房,ai人工智能服务器托管提供bgp线路100M独享,G口带宽及机柜租用的专业成都idc公司。
实参与形参数据传递有两种方式:值传递与地址传递。
地址传递的形式为
int
a=b;
也就是我们所说的引用,但引用只有C++中有,所以C语言都是值传递的。
有些人有误解:认为C语言的int
*p=a;不也是按地址传递吗?其实不是这样的。
深入理解值传递与地址传递就会发现:
值传递是:把实参的值传给一个变量(形参)。所以int
*p=a也是把a的地址值传给了指针变量p
地址传递是:直接把地址传进来,没有赋给任何变量,这样在函数体内对形参的操作也就是对实参地操作。有这种功能的也就是引用()了。
C不支持引用传递,引用传递属于C++特性。
如果要修改被传递的值,C中只能用指针传递。
在函数调用的时候,只是把原本参数的值赋值给了函数中的形式参数。在exchange函数中操作的是形参,没有对原本函数做出操作,所以输出结果是 x = 4,y = 2 a = 2,b = 4。
这次在函数调用的时候是吧a,b的地址赋值给了px,py,所以交换的是真正的a,b变量此时输出的结果是*px = 4,*py = 2
a = 4,b =2 。
这个取地址的引用传递虽然看起来像值传递,然而确实真正的改变原来常量的值,就像下棋一样操作的不是棋子,而是棋手。
在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语言要这样写:
void Exchg3(Rect *x, Rect *y){ /* ... */ }
// 然后传递指针:
Exchg3(a, b);