C语言地址传递与值传递

  1、在C语言中,所有非数组形式的数据实参都是以值传递的形式调用,在值传递的过程中,被调用函数的形式参数被视为该函数的局部变量,即在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的一个拷贝。所以被调用函数不能修改作为实参的实际变量的值,而只能修改传递给他的那份备份。

  2、而在地址传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址,被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

  3、同时,还有一个问题值得大家注意:无法向函数传递一个数组

可以验证一下:


void fun(char a[10])
{
	int i = sizeof(a);
	char c = a[3];
}

如果数组真的传递到函数内部,那么i的值应该是10,可惜,i的值为4,的确没有传递过去。

   C语言中,当一维数组作为函数的参数时,编译器总是把它解析成一个指向其首元素地址的指针。


针对上面的值传递与地址传递,下面用代码说明问题:


/*
 * main.c
 *
 *  Created on: Apr 28, 2012
 *      Author: root
 */

#include <stdio.h>

void swap_val(int x, int y)
{
	int temp;

	temp = x;
	x = y;
	y = temp;

	printf("x = %d, y = %d\n", x, y);
}

void swap_addr(int *x, int *y)
{
	int temp;

	temp = *x;
	*x = *y;
	*y = temp;
}

int main(void)
{
	int a, b;

	printf("please input two integer\n");
	scanf("%d %d", &a,&b);
	if (a < b) {
		swap_val(a, b);
		printf("a = %d, b = %d\n", a, b);
		swap_addr(&a, &b);
		printf("a = %d, b = %d\n", a, b);
	}

	return 0;
}
 

验证结果如下:

please input two integer
1
2
x = 2, y = 1
a = 1, b = 2
a = 2, b = 1


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值