#includestdio.h
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比洛江網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式洛江網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋洛江地區(qū)。費用合理售后完善,十余年實體公司更值得信賴。
//定義類型fun_ptr,它是一個函數(shù)指針,指向的函數(shù)返回值為int,參數(shù)為int
typedef?int?(*fun_ptr)(int);
//fun1
int?fun1(int?a)
{
printf("call?fun1,pram=%d,return?%d+1\n",?a,?a);
return?a+1;
}
//fun2
int?fun2(int?a)
{
printf("call?fun2,pram=%d,return?%d+2\n",?a,?a);
return?a+2;
}
int?main(int?argc,?char?*argv[])
{
int?a?=?10;
int?s?=?0;
//定義函數(shù)指針類型的變量p_fun
fun_ptr?p_fun;
//指向fun1
p_fun?=?fun1;
//執(zhí)行
s=p_fun(a);
printf("s=%d\n",?s);
//指向fun2
p_fun?=?fun2;
//執(zhí)行
s=p_fun(a);
printf("s=%d\n",?s);
return?0;
}
執(zhí)行結(jié)果:
在程序運行時,一個函數(shù)占用一段連續(xù)的內(nèi)存。當(dāng)調(diào)用一個函數(shù)時,實際上是跳轉(zhuǎn)到函數(shù)的入口地址,執(zhí)行函數(shù)體的代碼,完成后返回。
函數(shù)指針指向一個函數(shù)的入口地址,也就是函數(shù)存儲空間的首地址。
在C語言中,數(shù)組名代表數(shù)組的首地址,同樣函數(shù)名代表了函數(shù)的首地址,因此在賦值時,直接將函數(shù)指針指向函數(shù)名就行了。
因此函數(shù)指針調(diào)用vs直接調(diào)用,占用的存儲空間都是一樣的。相當(dāng)于數(shù)組指針和數(shù)組名的關(guān)系,指向的都是同一個數(shù)組。
局部變量存在函數(shù)體里面,比如轉(zhuǎn)換成8086匯編(示意):
func: 定義變量
push ax
pop ax
ret
main: call func
滿意請采納,謝謝!
并不是不規(guī)范的問題,你子程序?qū)懛ㄖ荒茉谧映绦蛑休敵稣_的數(shù)據(jù),而在主函數(shù)中無法得到交換過的x和y的值。參考程序運用指針讓子程序去讀寫a和b的值,在子程序執(zhí)行完成后,a和b的值確實得到了交換。
你的程序中子程序采用的不是指針類型參數(shù),這樣子程序無法將交換過后的值傳回來。