背景
在正常使用过程中,突然发现有用二级指针传递地址,我想没必要用二级指针,实际目的是函数入参的参数,也是函数出参的参数
例子
函数正常返回值方式
正常的都是使用返回值的方式
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 的地址
对应关系如图,这样就清晰多了
后记
我觉得二级指针不好,看各个人的所爱了