打印
[学习资料]

C语言传值与传地址调用

[复制链接]
353|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wiba|  楼主 | 2023-10-17 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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

使用特权

评论回复
沙发
chenjun89| | 2023-10-17 19:36 | 只看该作者
直接传指针地址

使用特权

评论回复
板凳
单片小菜| | 2023-10-19 11:07 | 只看该作者
直接传指针地址就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

3312

帖子

3

粉丝