概述
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语言函数间的复制传值,分析结构图如下:
分析:由于是函数局部变量的传递,所以发生在栈中,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
运行与参数传递图如下:
由此可见,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并未分配到内存中的地址,所以其指向的值并未发生改变。
那么为了避免这种情况,可以参考以下两种方法:
第一种,使用二维指针为一维指针分配地址,我们常听说只有指向变量的指针才能操作变量的地址,那么也只有指向指针的指针才能操作指针的地址:
#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
程序分析图:
第二种,使用返回值传回地址:
#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语言以值参方式传递函数参数,参数传递所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复