1 前提
在项目中,需要将一个数组里面的内容传递出来,但是上层调用者,并不知道下层数据的长度。为此我做了一些,尝试。这些例子,暴露出了对C语言理解的问题。
2 实现方法
2.1 方式1
底层函数:采用传指针的形式,将demo中的数据copy出去。
void dataTrans(char *destion)
{
char demo[3] = { '4', '5', '6' };
*destion = demo[0];
*(destion + 1) = demo[1];
*(destion + 2) = demo[2];
}
上层调用:该方式调用传入一个char 类型的指针给dataTrans 函数,由于,函数内部有对地址的偏移操作。而上层函数并没有预留一个空间给实际参数ptr,因此,该操作会导致地址会被改写。
void main()
{
//char a[3] = { '1', '2', '3' };
char *ptr = 0;
dataTrans(ptr);
printf("%c", *ptr);
while (1);
}
2.1 方式2
底层函数:采用传指针的形式,将demo中的数据的指针copy出去。
void dataTrans(char *destion)
{
char demo[3] = { '4', '5', '6' };
destion = demo;
}
上层调用:该方式调用传入一个char 类型的指针给dataTrans 函数,由于,底层函数是直接更改的指针,而这种方式只会改变形参,不会更改到实参,所以打印输出额值为1,不会为4。
void main()
{
char a[3] = { '1', '2', '3' };
char *ptr = a;//这里必须初始化,不然访问指针的时候会出现错误。
dataTrans(ptr);
printf("%c", *ptr);
while (1);
}
3 修改后的程序
根据前面的两种错误的案例示范,已经知道,需要传递出一个指针出来,同时这个指针是需要指向需要移出来数组的第一个地址,这里就必须使用指针的指针。
void dataTrans(char **destion)
{
char demo[3] = { '4', '5', '6' };
* destion = demo;//或为&demo[0]
}
调用方式:将指针变量取地址,作为实参传递。从而改变了ptr的指向内容。从而实现了将
void main()
{
// char a[3] = { '1', '2', '3' };
char *ptr = 0;
dataTrans(&ptr);
printf("%c", *ptr);
while (1);
}
————————————————
版权声明:本文为CSDN博主「猴哥取经」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37634871/article/details/126582310
|