1. 程式人生 > >函式指標微信畢業文章

函式指標微信畢業文章

微信文章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;
}