c语言函数返回值的几种方式,入参方式回传数据

背景

在正常使用过程中,突然发现有用二级指针传递地址,我想没必要用二级指针,实际目的是函数入参的参数,也是函数出参的参数

作为参数传入func
退出func
指针初始化为空
func内申请内存
已申请到内存继续使用

例子

函数正常返回值方式

正常的都是使用返回值的方式

int func(void)
{
	return 10;//这个就是返回的值
}
int main(int argc, char *argv[])
{
	int val = func();//val = 10
	return 0;
}

地址方式传入

void func(int address)
{
	*(int*)address = 10;//地址作为参数传入,强制转换为指针,指针上的值改变为10
}
int main(int argc, char *argv[])
{
	int val = 100;
	func(&val);//val = 10
	return 0;
}

这里默认地址长度为 int 大小,这里是传入地址,func 对地址值 上的数据改变,退出函数后地址值上的数据已经被改变。

指针方式传入

char tmp[] = "12345679";
void func(void* address)
{
	*(char*)address = tmp;//address是val的地址,强制转换对地址上值操作,就是改变val地址上的值,就是val
}
int main(int argc, char *argv[])
{
	char* val = NULL;//指针初始化为NULL,实际是val=NULL,val的地址是固定值
	func(&val);//应传入val的地址
//	func(val);//这个是错误的,因为val是NULL
	return 0;
}

这里具体应用是传入地址,func可以申请内存,可以操作内容

二级指针

char tmp[] = "12345679";
void func(void** address)
{
	*address = tmp;//address是val的地址,对地址上值操作,就是改变val地址上的值,就是val
}
int main(int argc, char *argv[])
{
	char* val = NULL;//指针初始化为NULL,实际是val=NULL,val的地址是固定值
	func(&val);//应传入val的地址
//	func(val);//这个是错误的,因为val是NULL
	return 0;
}

实际上和上面效果一样,我认为此时这样使用就没必要了,二级指针没发挥作用。

入参的值

void func1(void* address);
void func2(void** address);
void func3(void*** address);
int main(int argc, char *argv[])
{
	char* val = NULL;
	func1(&val);
	func2(&val);
	func3(&val);
	return 0;
}

以上,实际上 三个func的入参 address 都是 &val ,是 val 的地址
在这里插入图片描述
对应关系如图,这样就清晰多了

后记

我觉得二级指针不好,看各个人的所爱了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值