1. 程式人生 > >C函式中形參為引用的情況;C++中 *a 和 *&a 的區別

C函式中形參為引用的情況;C++中 *a 和 *&a 的區別

開發十年,就只剩下這套架構體系了! >>>   

引用經常被用作函式的引數,使得被呼叫函式中的引數名成為呼叫函式中的變數的別名。
這種傳遞引數的方法稱為按引用傳遞(pass by reference)。
按引用傳遞允許被呼叫的函式訪問(讀寫)呼叫函式中的變數。
void foo(int* ptr);    //按值傳遞(pass by value)
int a;
int* pValue = &a;
foo(pValue);
其中,pValue的值不能被函式foo改變,即pValue指向a。
但是如果是
 void foo(int*& ptr); //按引用傳遞(pass by reference)
 void foo(int*& ptr) 
{
    ptr = NULL;
}
呼叫過後,pValue就變成了NULL。而第一種情況下pValue不能被改變。
引用是C++的重要特性之一,在大多數情況下避免了使用指標。在C++中,引用不可憑空捏造,因為引用是目標變數的別名。
上述foo函式要用C來實現,則要用指標的指標
void foo(int** pptr)
{
    *pptr = NULL;
}
呼叫時要foo(&pValue)
這種技術很多用在比如定義一個安全刪除引用的函式。所謂安全,就是隻有當引用不為空的時候才執行刪除,
刪除之後,立刻把引用賦值為NULL。
template<typename T>
inline safe_delete(T*& ptr)
{
    if (ptr)
    {
        delete ptr;
        ptr = NULL;
    }
}
C++中,應儘量避免使用指標

示例一

#include <iostream>
#include <string>

void foo(int*& ptr){
    ptr = NULL;
    
}

int main()
{
    //printf("Hello, World!\n");
    int a = 1;
    int* pValue = &a;
    printf("a=%d\n",a);
    printf("pValue=%p\n",pValue);
    foo(pValue);
    printf("a=%d\n",a);
    printf("pValue=%p\n",pValue);
    return 0;
}
/** OUTPUT
a=1
pValue=0x7a5731c9cddc
a=1
pValue=(nil)
**/

示例二

#include <stdio.h>

void foo(int** pptr){
    *pptr = NULL;
    
}

int main()
{
    //printf("Hello, World!\n");
    int a = 1;
    int* pValue = &a;
    printf("a=%d\n",a);
    printf("pValue=%p\n",pValue);
    foo(&pValue);
    printf("a=%d\n",a);
    printf("pValue=%p\n",pValue);
    return 0;
}
/* OUTPUT:
a=1
pValue=0x7fff80e16a7c
a=1
pValue=(nil)
*/

參考博文

C++中引用(&)的用