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 = "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;
}
參考: