函數結束後,裏面的局部變量還可以用嗎

int *fun1()
{
 int a = 1;
 return &a;
}

int main()
{
 int *p =fun1();
 cout<<"*p="<<*p<<endl;
 *p = 100;
 cout<<"*p="<<*p<<endl;
 return 0;
}
結果:
*p=1
*p=100

以上可以看出a在fun1中是個局部變量,按理說該函數結束後,a變量應該不能訪問了,

但是上面的例子中,通過返回a的地址,在fun1()調用後,打印了a(也就是*p)的值發現

還是fun1()中a的初始值1,然後又對a進行賦值,發現也可以,沒出錯。從這裏看出其

實一個函數中的局部變量在該函數結束後,很多情況下還是可以對它訪問的,只要有它

的地址。上面的例子中,fun1()調用後打印a的值是1,這貌似是理所當然的,因爲

fun1()中初始化a=1,而且後面也沒明顯有改變a值的操作。當然還是a爲1咯!但是真是

這樣嗎?看下面代碼:


int *fun1()
{
 int a = 1;
 cout<<a<<endl;
 return &a;
}

int main()
{
 int *p =fun1();
 cout<<"*p="<<*p<<endl;
 return 0;
}
上面代碼執行後結果:
a=1
*p=4199929
(上面結果中*p就是a,p指向的就是變量a的地址,所以*p就是a)
發現調用fun1()後的a值竟然變了(1變成4199929),也沒明顯改變a值的操作啊,這是爲什麼呢?這個例子和第一個的區別只在於fun1()中只多了"cout<<a<<endl;"這句而已;難道是因爲這句?對的,

就是因爲這句代碼,該句代碼其實是這樣的:cout.operator<<(a).operator<<(endl);
也就是說a作爲實參傳個了cout.operator<<();那是不是其他函數用a爲實參時a也會變

化呢?


void power(int a)
{
 int b;
 b = a;
}

int *fun1()
{
 int a = 1;
 power(a);
 return &a;
}

int main()
{
 int *p =fun1();
 cout<<"*p="<<*p<<endl;
 return 0;
}
結果爲:
*p=4199915
發現結果也變了。我們猜想是不是因爲對a所在的內存進行了操作導致的呢?

 


int *fun1()
{
 int a = 1;
 int b = a;
 return &a;
}

int main()
{
 int *p =fun1();
 cout<<"*p="<<*p<<endl;
 return 0;
}
結果:
*p=1
把a的值賦給新建的變量b(對a的地址操作了),發現這樣子的話,結果爲1,沒有改變。

 

 

void power(int a)
{
}

int *fun1()
{
 int a = 1;
 power(a);
 return &a;
}

int main()
{
 int *p =fun1();
 cout<<"*p="<<*p<<endl;
 return 0;
}
結果:
*p=4199915
其中power函數體內沒對a有任何操作,a的值也發生了變化。可以證明是函數調用的準

備工作或者收尾工作導致了a的值變化,具體是什麼原因小菜我目前也還不知道。^_^

 

指針是很強大的,但不要濫用指針。

 

---------本人菜鳥一隻,文章如有錯誤,大牛們多多指出。


發佈了41 篇原創文章 · 獲贊 16 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章