首先,說(shuō)一下第一個(gè)問(wèn)題,第一個(gè)不交換是因?yàn)槎x的k是一個(gè)指針,指針說(shuō)白了就是一個(gè)指向,我指向你,他指向她,然后換成我指向她,他指向你,你把他們指向的位置交換,而并沒(méi)有交換他們地址里面存儲(chǔ)的值,這樣是并沒(méi)有任何區(qū)別,在最后函數(shù)結(jié)束之后,函數(shù)的那些指針指向全部釋放,和修改不修改沒(méi)什么兩樣;定義的是一個(gè)整型變量,他把s
10年積累的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有南宮免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
指針指向的地址里面的值與
t
指針指向的地址的值進(jìn)行了交換,這樣就修改了內(nèi)存里面的值,即便是函數(shù)結(jié)束了也不會(huì)釋放,自然就能做到交換了。
第二個(gè)問(wèn)題,存儲(chǔ)地址是會(huì)釋放,但是釋放的是函數(shù)內(nèi)部定義的局部變量,現(xiàn)在你已經(jīng)把s的地址通過(guò)return
返回回來(lái)并且存在
主函數(shù)的
r
中了,所以自然就不會(huì)釋放了
C語(yǔ)言指向函數(shù)的指針承載的信息比較復(fù)雜,組織起來(lái)要素要寫(xiě)全。根據(jù)指向函數(shù)的指針的書(shū)寫(xiě)語(yǔ)法,下面的代碼就是一個(gè)返回函數(shù)指針的函數(shù):
int (*f(void))(int){//f是函數(shù),沒(méi)有參數(shù),返回指向一個(gè)函數(shù)的指針;這個(gè)被指向的函數(shù)有一個(gè)int型形參,且返回一個(gè)int值
return fun;//fun是個(gè)函數(shù)名,必須具備一個(gè)int形參、返回int值的要求
}
以下代碼可以驗(yàn)證上述函數(shù)的正確性:
//#include?"stdafx.h"http://If?the?vc++6.0,?with?this?line.
#include?"stdio.h"
int?fun(int?n){
printf("abcdef\n");
return?n;
}
int?(*f(void))(int){
return?fun;
}
int?main(void){
printf("%d\n",f()(100));//調(diào)用函數(shù)f,通過(guò)f返回的指針用100調(diào)用函數(shù)fun
return?0;
}
輸出是:
abcdef
100
進(jìn)入fun函數(shù)時(shí),會(huì)創(chuàng)建一個(gè)局部變量形參stu,這個(gè)形參stu與實(shí)參stu1不是一回事,stu只是與stu1數(shù)據(jù)一模一樣的復(fù)制品而已。當(dāng)fun函數(shù)對(duì)stu操作結(jié)束后返回stu的指針,但因?yàn)閟tu是局部變量,在fun函數(shù)結(jié)束后會(huì)釋放掉,由于main函數(shù)使用fun函數(shù)返回的指針pp,pp指向了已被釋放掉的stu,所以打印時(shí)必然輸出些亂碼。