今天話了點時間想了一下用雙重指針做參數傳遞的問題,以前一直只知道用,沒有細想過為什麼,今天正好有點xian。
#include"stdio.h"
void fun(char * pa)
{
printf("pa的值:%d\n",pa);
pa = "bb";
printf("pa的值:%d\n",pa);
}
int main(void)
{
char * p = 0;
printf("p的值:%d\n",p);
fun(p);
if(p != 0)
{
printf("改變後輸出p = ");
puts(p)
}
else
{
printf("p值未改變!\n");
}
return 0;
}
結果輸出"p值未改變!",分析一下不難理解:給fun函數傳參的時候,其實應該是有一個隱形的操作pa=p ,這個操作和普通的兩個變量賦值是一樣的,把p的值賦給了pa,
然後,我們通過打印出來的值可以看到,在fun裡面,pa的值原本是p的地址的,但是,pa在fun裡面指向了“bb”,這樣,問題就出來了,pa的值確實改變了,指向也變了,
但是,我們想要改變的p的值仍舊是”0“。
後來,我發現,p的值沒有改變是因為pa改變的是他自己的值,沒有改變他的指向的地址的值,但在這個例子裡面作為參數的p初始化是0,也就是NULL,如果進行*pa = 'b'
這樣的操作的話是非法的。 為了使操作成功,我給p賦了初值”aa“,然後進行這個操作發現仍舊不成功。原來,因為計算機的內存主要是分為:棧區、堆區、靜態區、只讀
區,其中,棧區,分配的是局部變量空間,比如是函數的調用,局部變量,需要執行的代碼等等一些不需要我們手動分配和釋放的內存;堆區,是向上增長的,主要是分配程序員申請的空間;靜態分區,分配的是靜態變量、全局變量;只讀分區,分配的是常量和代碼空間。 所以,這個操作才會失敗。。
現在,來總結一些:首先,我們需要的結果是通過傳遞一個指針,來改變這個指針的指向的值,上面那個例子裡面,傳遞的僅僅是一個地址值,因此,在下面的例子裡面,我們需要傳遞的是一個完整的指針變量,我把這個指針變量的地址傳進去,這就是我理解的二重指針做參數:
#include"stdio.h"
void fun(char ** pa)
{
printf("pa的值:%d\n",pa);
*pa = "bb";
printf("pa的值:%d\n",pa);
}
int main(void)
{
char * p = 0;
printf("p的值:%d\n",p);
fun(&p);
if(p != 0)
{
printf("改變後輸出*p = ");
puts(p);
}
else
{
printf("p值未改變!\n");
}
return 0;
}
OK,把指針p的地址作為參數傳遞給fun函數,pa=&p;*pa="bb";這樣就可以p的值就變成"bb"在只讀區的地址了。。。
高手勿噴。。。。有錯歡迎指正!
高手勿噴。。。。有錯歡迎指正!
高手勿噴。。。。有錯歡迎指正!
謝謝!
摘自 門牙將軍