引用常常被用做函數的參數,使得被調用函數中的參數名成爲調用函數中的變量的別名。
這種傳遞參數的方法稱爲按引用傳遞(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) */
參考博文安全