c语言以值参方式传递函数参数,参数传递

本文详细介绍了C语言中参数传递的两种方式:值传递和地址传递。通过实例代码展示了如何在函数间传递变量值以及如何通过指针传递地址来改变原变量的值。讨论了在初始化函数中为指针分配内存可能出现的问题,并提出了两种解决方案:使用二维指针或通过返回值传递地址。
摘要由CSDN通过智能技术生成

C语言中的参数传递

值传递

通过在main函数中定义int类型的变量p,在main中赋值10,经过参数传递函数Passparam进行测试:

#include

#include

void Passparam(int p)

{

printf("in function, before assignment:%dn",p);

p = 20;

printf("in function, after assignment:%dn",p);

}

int main(void)

{

int p;

p = 10;

printf("in main, before parameter passing:%dn",p);

Passparam(p);

printf("in main, after parameter passing:%dn",p);

}

输出结果如下:

in main, before parameter passing:10

in function, before assignment:10

in function, after assignment:20

in main, after parameter passing:10

测试实现了C语言函数间的复制传值,分析结构图如下:

0ef2d058a0a118e3d3f015bbc98a0bf4.png

分析:由于是函数局部变量的传递,所以发生在栈中,main中的局部变量p被复制传递至Passparam函数中的形式参数p,所以Passparam中的p的改变不会引起main中的p值的改变

地址传递

地址传递,常见的例子即函数之间传递指针

#include

#include

void Passparam(int *p)

{

*p = 20;

}

int main(void)

{

//声明一个int类型的指针p

//暂时不用malloc为其分配内存地址,在后面的代码中会为它分配一个局部变量的地址

int *p;

int a;

a = 10;

//将a的在内存中的地址传递给p

p = &a;

printf("value in p: %pn",p);

printf("address of a: %pn",&a);

printf("before parameter passing, value of a: %dn",a);

Passparam(p);

//等效于Passparam(&a),即将a的地址传递给Passparam的形式参数p

printf("after parameter passing, value of a: %dn",a);

}

输出结果如下:

value in p: 0x7ffee8d9c4d4

address of a: 0x7ffee8d9c4d4

before parameter passing, value of a: 10

after parameter passing, value of a: 20

运行与参数传递图如下:

3b8a82f34ac2be834b7c519d6be7028e.png

由此可见,C中的地址传递,其实也是一种值传递,只是这里的值是地址而已

有时我们在main函数中,声明了指针,但是想通过封装初始化函数来为指针进行初始化,在初始化函数中用malloc为指针在堆中分配内存空间,可能会发现如下错误:

#include

#include

void initialize(int *p)

{

p = (int *)malloc(sizeof(int));

*p = 10;

}

int main(void)

{

int *p;

initialize(p);

printf("value in the address in p: %dn",*p);

}

输出结果:

in initialize, address of p: 0x7fd535405bd0

value in the address in p: -125990072

发现指针p指向的值并未变为10,原因如下:

虽然initialize中的p分配到了堆中的地址,main中的指针p并未分配到内存中的地址,所以其指向的值并未发生改变。

cf0abf016590682982b2589cc00bbb46.png

那么为了避免这种情况,可以参考以下两种方法:

第一种,使用二维指针为一维指针分配地址,我们常听说只有指向变量的指针才能操作变量的地址,那么也只有指向指针的指针才能操作指针的地址:

#include

#include

void initialize(int **p)

{

*p = (int *)malloc(sizeof(int));

printf("in initialize, value of p: %pn",p);

printf("in initialize, value in the address in p: %pn",*p);

**p = 10;

printf("in initialize, value in the address in the *p: %dn",**p);

}

int main(void)

{

int *p;

printf("in main, address of p: %pn",&p);

initialize(&p);

printf("in main, value of p: %pn",p);

printf("in main, value in the address in p: %dn",*p);

}

输出结果:

in main, address of p: 0x7ffeea59d4d8

in initialize, value of p: 0x7ffeea59d4d8

in initialize, value in the address in p: 0x7f8378c05bd0

in initialize, value in the address in the *p: 10

in main, value of p: 0x7f8378c05bd0

in main, value in the address in p: 10

程序分析图:

716704f45dc28b030486496d4a452e74.png

第二种,使用返回值传回地址:

#include

#include

int* initialize()

{

int* p;

p = (int *)malloc(sizeof(int));

*p = 10;

printf("in initialize, value of p: %pn",p);

printf("in initialize, value in the address in p: %dn",*p);

return p;

}

int main(void)

{

int *p;

p=initialize();

printf("in main, value of p: %pn",p);

printf("in main, value in the address in p: %dn",*p);

}

输出结果:

in initialize, value of p: 0x7ff23f405bd0

in initialize, value in the address in p: 10

in main, value of p: 0x7ff23f405bd0

in main, value in the address in p: 10

分析:通过在initialize函数中直接声明int *p并分配内存空间,同时赋值,最后回传地址给main中的指针p,实现初始化。

C语言中在函数参数声明区域,不能通过&直接获取实际参数对实参进行直接操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值