1. 程式人生 > >C語言 在被調函式中改變指標變數值的方法

C語言 在被調函式中改變指標變數值的方法

先看一段程式碼:

#include <iostream> 
void foo(char *p)
{
   p = "after foo()";
}     
void main()
{
   char *p = "before foo()";
   foo(p);     
   cout <<p <<endl;   
}

如果你指望函式foo能幫你改變p的值,那你就錯了。因為指標也是變數,它在函式呼叫過程中也是傳值呼叫的(C中函式引數都是傳值呼叫)。函式foo中的p只是區域性變數,它的作用域僅在子函式中。上面這段程式碼其實和下面這段效果是類似的:

#include <iostream> 
void foo(int i)
{
   i = 1;
}     
void main()
{
   int i = 0;
   foo(i);     
   cout <<i<<endl;   
}

這是foo函式顯然不會修改i的值,對於第一段程式碼的指標,也是同樣的道理。都是變數的傳值呼叫,一個是整形變數,一個是指標變數而已。

那麼,如何修改程式碼才能得到我們想要的效果呢?有三種方法。

一、使用return

#include <iostream.h>
char* foo()
{
 char* p = "after foo()";
 return p;
}
void main()
{
 char* p = "before foo()";
 p = foo();
 cout<<p<<endl;
}

二、使用指標引用

#include <iostream> 
void foo(char *& 

q)
{
   q = "after foo()";
}     
void main()
{
   char *p = "before foo()";
   foo(p);     
   cout <<p <<endl;   
}

該程式將p的地址傳給foo,則p=&q,而p是字串變數的記憶體地址,那麼&q也是字串變數的記憶體地址,則q也是指向該字串變數所在記憶體的指標。
簡單的說foo中的q這時是p的引用(別名),q和p共享同一個記憶體空間。這時在foo中修改q指向的記憶體空間的字串內容,main中p的值當然也隨之變化。

三、使用指向指標的指標

#include <iostream.h> 
void foo(char ** p)
{
   *p = "after foo()";
}     
void main()

   char **p = "before foo()";   
   foo(p);     
   cout <<*p<<endl;   
}

main中p是指向指標的指標,即它的值的值是指向字串變數記憶體的指標的地址,在foo中*p就表示該指標,即字串變數記憶體的地址。所以修改*p的值自然可以修改該記憶體的內容。

下面一段程式使用了同樣的原理:

#include <iostream.h> 
void foo(char ** p)
{
   *p = "after foo()";
}     
void main()

   char *p = "before foo()";   
   foo(&p);     
   cout <<p<<endl;   
}

參考: