C語言指向函數(shù)的指針承載的信息比較復(fù)雜,組織起來要素要寫全。根據(jù)指向函數(shù)的指針的書寫語法,下面的代碼就是一個返回函數(shù)指針的函數(shù):int (*f(void))(int){//f是函數(shù),沒有參數(shù),返回指向一個函數(shù)的指針;這個被指向的函數(shù)有一個int型形參,且返回一個int值 return fun;//fun是個函數(shù)名,必須具備一個int形參、返回int值的要求}以下代碼可以驗證上述函數(shù)的正確性:pre t="code" l="cpp"http://#include "stdafx.h"http://If the vc++6.0, with this line.
我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、壽光ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的壽光網(wǎng)站制作公司
#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,通過f返回的指針用100調(diào)用函數(shù)fun
return 0;
}輸出是:abcdef100
首先,說一下第一個問題,第一個不交換是因為定義的k是一個指針,指針說白了就是一個指向,我指向你,他指向她,然后換成我指向她,他指向你,你把他們指向的位置交換,而并沒有交換他們地址里面存儲的值,這樣是并沒有任何區(qū)別,在最后函數(shù)結(jié)束之后,函數(shù)的那些指針指向全部釋放,和修改不修改沒什么兩樣;定義的是一個整型變量,他把s
指針指向的地址里面的值與
t
指針指向的地址的值進(jìn)行了交換,這樣就修改了內(nèi)存里面的值,即便是函數(shù)結(jié)束了也不會釋放,自然就能做到交換了。
第二個問題,存儲地址是會釋放,但是釋放的是函數(shù)內(nèi)部定義的局部變量,現(xiàn)在你已經(jīng)把s的地址通過return
返回回來并且存在
主函數(shù)的
r
中了,所以自然就不會釋放了
這種方式叫做“用指針函數(shù)*creat()的返回值來傳遞動態(tài)內(nèi)存”,這是一個C語法
首先你要注意,子函數(shù)*creat()用了malloc動態(tài)申請內(nèi)存,而return返回的是指針變量所指向的地址,而不是指針!相當(dāng)于將你所申請的動態(tài)內(nèi)存返回給主函數(shù)
int
*fun(void)//這里是指針函數(shù)
{
int
*p
=
(int
*)
malloc
(int);//動態(tài)申請內(nèi)存//p在這里指向了一塊合法內(nèi)存的地址
return
p;
}
void
main(void)
{
int
*q
=
NULL;
q
=
fun();//fun()返回指針p所指向的地址,(指針p是在棧上創(chuàng)建的,所以*fun()函數(shù)運行完,指針?biāo)峙涞膬?nèi)存被系統(tǒng)自動釋放)這時q指向p,得到了malloc所申請到的內(nèi)存
free(q);//釋放動態(tài)內(nèi)存
}