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++中,應儘可能避免使用指針

示例一html

#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)
**/

示例二ios

#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++中引用(&)的用法和應用實例函數

相關文章
相關標籤/搜索