函式指標微信畢業文章
阿新 • • 發佈:2018-12-27
微信文章https://mp.weixin.qq.com/s/piueEBUSuXIrFlImeqlJ0w
手環髮卡程式設計:我有需要的是走流程,一個函式以後接著一個函式,我現在是做了陣列列表,就是準備好了一個一個的引數。
可以在此抽象,變成一個一個的函式,最後做一個數組,通過index來選擇函式的流程。
#include<stdio.h> #include <string.h> typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; void Function() { printf("Call Function!\n"); } int main() { void(*p)(); // *(int*)&p = (int)Function; // p = Function; p = &Function; (*p)();//務必這樣呼叫!!上面3個寫法都可以 //getchar();//使用sublime的時候務必不要這句話!!程式會在後臺執行!一直毒蛇! return 0; }
int main()
{
void(*p)()=Function;
(*p)();//務必這樣呼叫!!上面3個寫法都可以
//getchar();//使用sublime的時候務必不要這句話!!程式會在後臺執行!一直毒蛇!
return 0;
}
單純的炫耀技術
#include<stdio.h> #include <string.h> typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; char * fun1(char * p) { printf("%s\n", p); return p; } char * fun2(char * p) { printf("%s\n", p); return p; } char * fun3(char * p) { printf("%s\n", p); return p; } int main() { char * (*pf[3])(char * p);//---這是一個函式指標的陣列 每一都是一個函式 下面就是呼叫了 pone是簡單版本 看看我寫的髮卡程式吧 可以再次抽象 char * (*pone)(char * p); pf[0] = fun1; // 可以直接用函式名 pf[1] = &fun2; // 可以用函式名加上取地址符 pf[2] = &fun3; pone = fun3; pf[0]((char *)"fun1"); pf[0]((char *)"fun2"); pf[0]((char *)"fun3"); pone((char *)"hello"); // getchar(); return 0; }
知道看別人的程式碼 我們有時候看別人的程式碼時候,經常是一臉懵逼,比如下面這個 void (*p)(); 還有這個((void(*) ())0)(); 我記得我在以前的文章裡面有談到一個右左原則,從p開始看,往右走直到遇到)再往左走遇到( ,(*p) 我們就可以看出p是一個指標,繼續分析往右走,遇到(),說明p指向一個(void)的函式,往左走,知道p指向的函式返回值是void。ok,看下面的例子。 #include "stdio.h" void Function() { printf("Call Function!\n"); } int main() { void(*p)(); *(int*)&p = (int)Function; (*p)(); getchar(); return 0; } 上面函式輸出 上面函式輸出 然後繼續分析 ((void(*) ())0)(); 1、void (*)() 我們上面分析了這個是一個函式指標,只是把p去掉了而已。 2、把上面的void (*)()用PN代替,上面的表示式變成((PN)0)();PN後面有一個0,這個是讓我們咋舌的地方,然後我們向一下 (char)a;這樣的表示式,所以(PN)0就是把0當成一個地址,強制轉換為PN型別,*用這個鑰匙取出這個地址區域的值。 3、把(*(PN)0)()替換成PM,原來的表示式變成PM(),這樣大家看起來比較容易了吧,就是正常的函式呼叫。 給個例子自己去參透一下 #include <stdio.h> #include <string.h> char * fun1(char * p) { printf("%s\n", p); return p; } char * fun2(char * p) { printf("%s\n", p); return p; } char * fun3(char * p) { printf("%s\n", p); return p; } int main() { char * (*pf[3])(char * p); pf[0] = fun1; // 可以直接用函式名 pf[1] = &fun2; // 可以用函式名加上取地址符 pf[2] = &fun3; pf[0]("fun1"); pf[0]("fun2"); pf[0]("fun3"); getchar(); return 0; }