前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >函数入参使用指针和引用的区别

函数入参使用指针和引用的区别

作者头像
charlieroro
发布2020-03-24 11:41:46
7260
发布2020-03-24 11:41:46
举报
文章被收录于专栏:charlierorocharlieroro

最近做一个工具,在整改函数时需要给一个全局变量赋值

RadixNode *g_pstRootBase

赋值的来源为已定义的结构体:TreeSet treeSet = {0}中的trSet->tNameSet[i].tName地址(其中i为变量。

以下是trSet结构体的定义:

typedef struct tagTreeName { RadixNode *tName; char *fName; }TreeName; typedef struct tagTreeSet { TreeName tNameSet[MAX_SYMBOL_TREE_NUM]; int realNum; }TreeSet;

因为其他处理的需要,写了个函数,函数原型为:

int setTreeName(TreeSet *trSet, RadixNode **tName)

想通过第二个入参tName将trSet->tNameSet[i].tName的地址赋值给g_pstRootBase(函数有删减)

传参方式为:setTreeName(&trSet, &g_pstRootBase),内部处理如下

int setTreeName(TreeSet *trSet, RadixNode **tName) {

tName = &trSet->tNameSet[i].tName; }

}

但在调试的时候发现g_pstRootBase并没有赋值成功,即g_pstRootBase仍然是初始值

分析一下才发现&g_pstRootBase的意思是的g_pstRootBase地址,并不是一个真正的指针变量,可以认为就是一个地址常数!

修改函数中对g_pstRootBase的赋值方式如下:

int setTreeName(TreeSet *trSet, RadixNode **tName) {

*tName = (RadixNode*)(&trSet->tNameSet[i].tName); }

}

这样程序就可以正常运行了,即将&trSet->tNameSet[i].tName的地址赋值到地址*tName上

通过以上可以总结出:尽量少用引用作为左值,如果需要通过函数参数来赋值(出参),最好使用临时指针变量来获取地址,再赋值给需要的变量

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-02-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档