幾篇先前幫新玩 C 語言的一個朋友整理的 pointer 操作說明

例 1

#define nelement(a) (sizeof(a) / sizeof(a[0]))

static void hello()
{
        printf("hello\n");
}

static void world()
{
        printf("world\n");
}

typedef void (*callback)();

int main()
{
    callback cbs[] = { hello, world };
    int i;
    for(i = 0; i < nelement(cbs); i ++) {
        cbs[i]();
    }
}

執行結果

$ gcc -o test test.c -Wall && ./test
hello
world

定義了一個叫 callback 的 type, 用來簡化 prototype 為 void (*)() 的 function pointer 參考. 並在 main() 中宣告了一個該類型的 array 叫 cbs, 裡面有兩個 element 分別是 hello()world() 的 address.

然後用 loop 去 call 放在 cbs 中的每個 function pointer.

例 2

static void garbage_in(int v, char *s)
{
        printf("print v is ok: %d\n", v);
        printf("print s is no ok: %s\n", s);
}

typedef void (*callback)();

int main()
{
    callback cb = (callback) garbage_in;
    cb();
}

執行結果

$ gcc -o test test.c -Wall && ./test
print v is ok: 1
print s is no ok: BVI
$ gcc -o test test.c -Wall && ./test
print v is ok: 1
print s is no ok: 2T

Function pointer 能被自由的在不同 prototype 的 function pointer 間 cast, 但, 像是參數的傳遞, 執行結果的回傳, 必須要有機制去確保傳遞的正確性, 不然 function 中會讀到 stack 上留下的隨機資訊, 在進行如 pointer dereference 時就有高概率掛掉 (就算不掛, 程序行為也不正確).