我是靠谱客的博主 专注背包,最近开发中收集的这篇文章主要介绍c语言以值参方式传递函数参数,参数传递,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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语言中在函数参数声明区域,不能通过&直接获取实际参数对实参进行直接操作。

最后

以上就是专注背包为你收集整理的c语言以值参方式传递函数参数,参数传递的全部内容,希望文章能够帮你解决c语言以值参方式传递函数参数,参数传递所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部