zoukankan      html  css  js  c++  java
  • 函数入参使用指针和引用的区别

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

    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上

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

  • 相关阅读:
    python模块之xlrd,xlwt,读写execl(xls,xlsx)
    Gulp的常见用法
    Linux常用操作及命令大全
    解决谷歌云 ssh 登录权限被拒的问题 google cloud (publickey,gssapi-keyex,gssapi-with-mic)
    创建web服务器
    网站与服务器的基本知识
    flex布局与移动页面适应
    史上最全的maven的pom.xml文件详解
    linux maven安装
    在 Linux 下搭建 Git 服务器(yum安装)
  • 原文地址:https://www.cnblogs.com/charlieroro/p/8482783.html
Copyright © 2011-2022 走看看