硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1306|回复: 6
收起左侧

二级指针作为函数参数时,怎么修改这个参数才能修改原始调用的值呢?

[复制链接]

18

主题

285

回帖

339

积分

高级会员

积分
339
发表于 2020-3-10 16:20:11 | 显示全部楼层 |阅读模式

如题,二级指针作为函数的参数,函数里面怎么操作,才能修改二级指针指向的值呢?

一级指针时,函数中直接写:*p=多少,就可以了,如下
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void test(int *p)
  4. {
  5.     *p=100;
  6. }
  7. int main()
  8. {
  9.     int a=1;

  10.     printf("%d\n",a);
  11.     test(&a);
  12.     printf("%d\n",a);
  13.     return 0;
  14. }
复制代码


但是二级指针时,怎么才能修改调用这p的指向呢?
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. struct obj
  4. {
  5.   const int *pText;
  6.   const int ItemNum;
  7. };
  8. const struct obj object={"0123456789",10};
  9. const struct obj *pobj=&object;

  10. void test(const struct obj **p)
  11. {
  12.    *(*p)=&pobj;    //这里怎么修改这个式子才能修改p的指向呢?????
  13. }

  14. int main()
  15. {
  16.     const struct obj **p=NULL;

  17.     test(p);
  18.     printf("%s\n",*p->pText);

  19.     return 0;
  20. }
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-3-10 17:15:45 | 显示全部楼层
帮你简单改了下:

QQ截图20200310171331.png
回复

使用道具 举报

18

主题

285

回帖

339

积分

高级会员

积分
339
 楼主| 发表于 2020-3-10 17:43:30 | 显示全部楼层
eric2013 发表于 2020-3-10 17:15
帮你简单改了下:

多谢硬汉哥回复。。。
你这么改,当指针pobj指向的内容没有变化时,是可以的,输出是正确的
当时当pobj指向的内容变化时,这样改就不正确啦

我要实现的效果是:
1、pobj指针是一个文件私有的,别的文件无法调用,main中的p指针是用户定义的,我想编写一个函数,让p指向指针pobj,即p必须是指向指针的指针才对,这样的话,pobj指针指向的内容变化时,*p中的内容也跟着pobj变化了,这样我操作p指针,效果和操作pobj是一样的。2、如果p定义为一级指针,*p中的值就是*pobj,由于pobj指向的对象边了,*pobj也变化了,但是p中的内容却没有变【初始化函数只调用一次的情况下】

所以这里p必须是二级指针才能达到效果
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-3-10 19:42:08 | 显示全部楼层
木兰花 发表于 2020-3-10 17:43
多谢硬汉哥回复。。。
你这么改,当指针pobj指向的内容没有变化时,是可以的,输出是正确的
当时当pobj ...

明白,帮你修改了个。
QQ截图20200310194138.png


  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. struct obj
  4. {
  5.   const char *pText;
  6.   const int ItemNum;
  7. };

  8. const struct obj object={"0123456789",10};
  9. const struct obj object1={"www.armfly.com",10};
  10. const struct obj *pobj=&object;

  11. void test(const struct obj **p)
  12. {
  13.     *p = (const struct obj *)&pobj;   
  14. }

  15. int main()
  16. {
  17.     const struct obj **p;

  18.     test((const struct obj **)&p);
  19.    
  20.     printf("%s\n", (*p)->pText);
  21.    
  22.     pobj = &object1;

  23.     printf("%s\n", (*p)->pText);
  24. }
复制代码


回复

使用道具 举报

18

主题

285

回帖

339

积分

高级会员

积分
339
 楼主| 发表于 2020-3-10 22:03:08 | 显示全部楼层
eric2013 发表于 2020-3-10 19:42
明白,帮你修改了个。

硬汉哥威武,这么操作后确实可以了

但是还是不理解我那样的形式:**p=xxx;为什么不行呢?为什么这里非得要强制类型转换下呢?
后来又测试了3级指针,也是不行,如下:test(&p);
void test(const struct obj ***p)
{
   *(*(*p))=&pobj;//把pobj的地址放入形参中,**p得到了p的地址,即&p,***p中写入&pobj,这样就完成了指针的指针的赋值
}

回复

使用道具 举报

18

主题

285

回帖

339

积分

高级会员

积分
339
 楼主| 发表于 2020-3-10 22:07:43 | 显示全部楼层
eric2013 发表于 2020-3-10 19:42
明白,帮你修改了个。

看样子这样强制转换完后再传入形参,操作上似乎已经把这个指针的指针变成了一级指针,test函数中直接操作一级指针即可。。

不这样降级操作可以不?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-3-11 00:53:25 | 显示全部楼层
木兰花 发表于 2020-3-10 22:07
看样子这样强制转换完后再传入形参,操作上似乎已经把这个指针的指针变成了一级指针,test函数中直接操作 ...

这里强制类型转换主要是防止警告。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 16:04 , Processed in 0.305971 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表