编译原理2 三种传参方式

1. 传值

(1)形参和实参各占一个独立的存储空间。
(2)形参的存储空间是函数被调用时才分配的,调用开始,系统为形参开辟一个临时的存储区,然后将各实参传递给形参,这是形参就得到了实参的值。

例子

#include<stdio.h>
void swap1(int x, int y)//定义中的x,y变量是swap函数的两个形参
{
	int tmp;
	tmp = x;
	x = y;
	y = tmp;
	printf("x=%d,y=%d\n", x, y);
}
int main()
{
	int a = 2;
	int b = 3;
	swap1(a, b);//a,b变量为swap函数的实际参数
	printf("a=%d,b=%d", a, b);
	return 0;
}

此时输出的 a = 2;b=3;

2. 传名

引用传递是以引用为参数,则既可以使得对形参的任何操作都能改变相应数据,又使函数调用方便。引用传递是在形参调用前加入引用运算符“&”。引用为实参的别名,和实参是同一个变量,则他们的值也相同,该引用改变则它的实参也改变。

 #include<stdio.h>
void  swap3(int &x,int &y)
{
	int tmp = x;
	x = y;
	y = tmp;
	printf("x=%d,y=%d\n", x, y);
}
int main()
{
	int a = 2;
	int b = 3;
	swap3(a, b);//调用方式与传值一样
	printf("a=%d,b=%d", a, b);
	system("pause");
	return 0;

此时输出的a=3;b=2;

3. 传地址

它把实参的存储地址传送给形参,使得形参指针和实参指针指向同一块地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。

void swap2(int *px, int *py)
{
	int tmp;
	tmp = *px;
	*px = *py;
	*py = tmp;
	printf("px=%d,py=%d\n", *px, *py);
}
int main()
{
	int a = 2;
	int b = 3;
	swap2(&a, &b);/*调用了swap函数,同样也有隐含动作px=&a;py=&b;*/
	printf("a=%d,b=%d", a, b);
	return 0;
}

此时输出的a=3;b=2;

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C 语言中,函数方式有三种:值递(call by value)、引用递(call by reference)和指针递。 值递是最常见的方式,它会将实的值复制一份给形,在函数调用过程中,实的值不会改变。编译器在函数调用时会将实的值通过栈递到函数中,并为数分配内存空间,函数对数的修改不会影响到实。这种方式适用于基本数据类型的递,例如整数、浮点数等,以及结构体或对象的递。 引用递是通过指针间接访问实的值,使得函数中对数的修改能够影响到实编译器在函数调用时会将实的地址递给形,在函数内部通过指针间接访问实的值。这种方式适用于需要修改实值的情况,例如交换两个变量的值或者修改数组元素等。 指针递与引用递类似,通过指针来数。编译器在函数调用时会将指针的值递给形,使得函数能够通过指针来访问实的值。这种方式适用于需要修改实值或者函数返回多个值的情况,例如动态内存分配、链表操作等。 这三种方式的选择取决于函数的需求和实的特点。一般来说,如果函数中不需要修改实的值,可以使用值递;如果函数需要修改实的值,可以使用引用递或指针递。其中,引用递可以简化对指针的操作,但同时也增加了代码的复杂性,而指针递需要谨慎处理指针的空指针问题。因此,在选择方式时需要考虑函数的功能需求、实的特点以及代码的复杂性和可读性等因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值