一,函式指標的實質
1,函式指標的實質還是指標,還是指標變數。本身佔四個位元組(32位系統)。
2,函式指標、陣列指標、普通指標之間本身沒有區別,區別在於指標指向的東西是個什麼玩意。函式指標指向乙個函式,陣列指標指向乙個陣列。
3,函式的實質是一段**,這一段**在記憶體中是連續分布的(乙個函式的大括號括起來的所有語句將來編譯生成的可執行程式是連續的),所以對於函式來說很關鍵的是函式中的第一句**的位址,這個位址就是所謂的函式位址,在c語言中用函式名這個符號來表示。
4,結合函式的實質,函式指標其實就是乙個普通變數,這個普通變數的型別是函式指標變數型別,它的值就是某個函式的位址(也就是它的函式名這個符號在編譯器中所對應的值)。
二,函式指標的書寫和分析方法
1,所有的指標變數型別其實本質都是一樣的,但是為什麼c語言中要去區分它們,寫法不一樣呢(比如說,int型別指標寫做 int *p;陣列指標寫做 int (*p)[ ];函式指標就寫得更複雜了)。因為c語言是乙個強型別語言(每乙個變數都有自己得變數型別),編譯器可以幫助做嚴格的型別檢查,防止不必要得錯誤。
2,假設有個函式是:void func(void);對應得函式指標就是 void (*pfunc)( void);型別是:(void)(*) (void)。
3,函式名和陣列名最大得區別在於:函式名做右值時加不加&效果和意義都是一樣得,但是陣列名做右值時加不加&就是不一樣的。a表示的是陣列首元素的首位址,型別是int *;&a表示的是陣列首位址,型別是 int (*)[ ]。
#include
int main(void)
; int *p = a; //型別匹配
int *p1 = &a; //型別不匹配,編譯警告
int (*p2)[5] = &a; //型別匹配
return 0;
}
4,寫乙個複雜的函式指標,比如說strcpy函式 char *strcpy(char *dest,const char *src); char *(*pstrcpy)(char *,const char *);
#include#includeint main(void)
; int *p = a; //型別匹配
int *p1 = &a; //型別不匹配,編譯警告
int (*p2)[5] = &a; //型別匹配
char *(*pstrcpy)(char *,const char *);
char b[10] = ;
pstrcpy = strcpy;
pstrcpy(b,"hello world");
printf(" b = %s \n",b); //hello world
}
《C語言筆記 函式指標》
一,函式指標的實質 1,函式指標的實質還是指標,還是指標變數。本身佔四個位元組 32位系統 2,函式指標 陣列指標 普通指標之間本身沒有區別,區別在於指標指向的東西是個什麼玩意。函式指標指向乙個函式,陣列指標指向乙個陣列。3,函式的實質是一段 這一段 在記憶體中是連續分布的 乙個函式的大括號括起來的...
C語言筆記(三)函式 指標
函式,相當於把大的任務拆分成小的模組,一般乙個函式不超過80行 每個程式只有乙個主函式 輸出資料只能是乙個。有多個返回值的時候可以使用乙個引數 函式宣告 只寫函式頭,不寫函式體 在函式宣告時,可以省略引數列表的引數名,只寫引數型別 傳值方式,在函式呼叫時,把實參值的乙份拷貝,賦值給形參 可以寫乙個例...
C語言自學筆記 C函式和指標
函式指標 主語是指標,即指向函式的指標。可以參照整型指標,字元型指標等概念來理解 函式指標實際上是函式 在記憶體中的起始位址。示例 int sub num1,num2 a,int宣告函式的返回值是整型 b,sub 通過 結合兩個物件使他們具有更高的運算優先順序,通知編譯器這是乙個指標型別的物件 c,...