天天看點

函數入參使用指針和引用的差別

最近做一個工具,在整改函數時需要給一個全局變量指派

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),内部處理如下

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

    }

}

但在調試的時候發現g_pstRootBase并沒有指派成功,即g_pstRootBase仍然是初始值

分析一下才發現&g_pstRootBase的意思是的g_pstRootBase位址,并不是一個真正的指針變量,可以認為就是一個位址常數!

修改函數中對g_pstRootBase的指派方式如下:

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

這樣程式就可以正常運作了,即将&trSet->tNameSet[i].tName的位址指派到位址*tName上

通過以上可以總結出:盡量少用引用作為左值,如果需要通過函數參數來指派(出參),最好使用臨時指針變量來擷取位址,再指派給需要的變量