并不是不規范的問題,你子程序寫法只能在子程序中輸出正確的數據,而在主函數中無法得到交換過的x和y的值。參考程序運用指針讓子程序去讀寫a和b的值,在子程序執行完成后,a和b的值確實得到了交換。
創新互聯建站主要從事網頁設計、PC網站建設(電腦版網站建設)、wap網站建設(手機版網站建設)、自適應網站建設、程序開發、網站優化、微網站、小程序設計等,憑借多年來在互聯網的打拼,我們在互聯網網站建設行業積累了豐富的成都網站設計、成都做網站、網站設計、網絡營銷經驗,集策劃、開發、設計、營銷、管理等多方位專業化運作于一體。
你的程序中子程序采用的不是指針類型參數,這樣子程序無法將交換過后的值傳回來。
具體方法如下:
1
void (*theUboot)(void);
theUboot = (void (*)(void))(0x30700000);
theUboot();
2
(*(void (*)(void))(0x30700000))();
函數指針是指向函數的指針變量。 因而“函數指針”本身首先應是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整型變量、字符型、數組一樣,這里是指向函數。
函數指針有兩個用途:調用函數和做函數的參數。
函數指針的聲明方法為:
返回值類型 ( *?指針變量名) ([形參列表]);
如:
int func(int x); /* 聲明一個函數 */
int (*f) (int x); /* 聲明一個函數指針 */
f=func; /* 將func函數的首地址賦給指針f */
或者使用下面的方法將函數地址賦給函數指針:
f = func;
賦值時函數func不帶括號,也不帶參數,由于func代表函數的首地址,因此經過賦值以后,指針f就指向函數func(x)的代碼的首地址。
下面的程序說明了函數指針調用函數的方法:
#includestdio.h
int?max(int?x,int?y){return?(xy??x:y);}
int?main()
{
int?(*ptr)(int,?int);
int?a,?b,?c;
ptr?=?max;
scanf("%d%d",?a,?b);
c?=?(*ptr)(a,b);
printf("a=%d,?b=%d,?max=%d",?a,?b,?c);
return?0;
}
函數指針告訴CPU下一步需要執行哪里的代碼的指針, 一數組十分相像.
#include?stdio.h
void?function(int?i,?double?d)????//一個函數的聲明
{
printf("函數運行,?%d,?%lf\n",?i,?d);
}
void?AnotherFunction(int?i,?double?d)????//另外一個函數聲明
{
printf("又一個函數運行,?%d,?%lf\n",?i,?d);
}
int?main()
{
void?(*pFun)(int,?double);????//定義了一個函數指針
int?(*p)(int?,?double);????//用于調試的函數指針
pFun?=?function;????//讓這個函數指針指向第一個函數
pFun(10,?10.101);????//通過這個函數指針來調用第一個函數
pFun?=?AnotherFunction;????//讓這個函數指針指向第二個函數
pFun(20,?20.202);????//通過這個函數指針來調用第二個函數
//若將以下代碼取消注釋,?就會產生錯誤
/*
p?=?function;
p?=?AnotherFunction;
//原因很簡單,?因為p是必須指向一個返回值為int,?第一個參數為int,?第二個參數為double的函數,?但是在此代碼中定義的函數返回值是void
*/
//這個實驗中,?直接用函數名來賦值了,?是因為函數名其實就是這個函數的指針
//而在平常調用函數時,?都要加上(),?如:printf("");
//這里,?"()"就相當于'*'(就是取值運算符),?printf是函數指針,?就相當于是數組名,?即數組的首地址
return?0;
}