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

Posted charlieroro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数入参使用指针和引用的区别相关的知识,希望对你有一定的参考价值。

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

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上

 

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

以上是关于函数入参使用指针和引用的区别的主要内容,如果未能解决你的问题,请参考以下文章

向函数中传递指针和传递指针的引用的区别

指针能作为引用参数吗?

按值传递指针和引用之间的区别?

李连杰的二级指针,二级指针的用途,多级指针的定义使用,数组与指针的区别,void 类型指针,引用

引用与指针的区别

传入参数 指针 引用和 什么都不加的区别