C语言参数传递

来源:互联网 发布:刺客列传网络剧视频 编辑:程序博客网 时间:2024/05/01 21:02

C语言的参数传递方式有两种:值传递和地址传递(或指针传递)。
值传递:
(1)采用值传递方式传递的变量(形参)是实参的“拷贝”,是函数的局部变量。
(2)函数结束后,局部变量虽然达到预期的改变,但其空间将自动释放,其值将被丢弃。
例1,我们定义如下函数:
void swap(int a, int b)
{
 int t = a;
 a = b;
 b = t;
}
当我们使用语句swap(a, b)后a和b并没有交换数据。

地址(指针)传递:
(1)函数中形参是实参的地址,通过指针,函数可以处理函数体外的变量空间。
(2)与值传递不同的是,地址传递中形参是实参地址的“拷贝”,而非实参值的“拷贝”。
(3)对于形参变量*ptr,函数可以处理“值”(*ptr或ptr->data),也可以处理“地址”(ptr)。
如果我们定义函数void func(int *a, int *b),并且定义变量int c=3, d=4;调用func(&c, &d)时,函数内外的内存结构如下图所示:

例2,处理“值”
void func(int *a, int *b)
{
 *a = *b;
}
该函数将b所指的“值”赋值到a所指的整形空间中。


例3,处理“地址”
void func(int *a, int *b)
{
 a = b;
}
该函数只修改了局部变量a的值,使其指向了b存储的地址(而非b的地址),并没有改变a所指的“值”(*a)。
这种情况没有达到预期结果,代码写成这样情况,一般是写错了。

例2和例3的图示如下,注意其中的不同:


关于strcpy, memcpy等函数,在函数中有逐个元素的赋值,所以函数也是对“值”的处理。


另外,C++中有引用传递的方式,定义方式如下:
void func(int &a, int &b);
这种&方式在C语言中是不能通过编译的。

原创粉丝点击