C函式中形參為引用的情況;C++中 *a 和 *&a 的區別
阿新 • • 發佈:2019-03-27
引用經常被用作函式的引數,使得被呼叫函式中的引數名成為呼叫函式中的變數的別名。
這種傳遞引數的方法稱為按引用傳遞(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)
*/