gas myvoid.c
[hirasawa@ubunt1004-32-2 gcc-Programming-Kobo]$ cat myvoid.c #include <stdio.h> int secret = 80486; int function( int key) { printf("your secret key is %d\n",key); return 123; } int main(void) { void * ptr; int i; ptr = (void*) &secret; i = *((int*) ptr); ptr = (void*) function; return ((int (*)(int)) ptr)(i); } int extra() { int (*fn)(int) = function; return fn(80486); } [hirasawa@ubunt1004-32-2 gcc-Programming-Kobo]$
順番に説明していくと
void * ptrの部分は、
prt is void pointer
int iの部分は
i is int
ここまでは、わかるでしょ?
ptr = (void*) &secretの部分は
変数secretのアドレスを (void*)にキャストして、ptrに代入
i = *((int*) ptr)の部分は
step1 括弧のなかみ (int*) ptrの部分は
ptrを(int*)にキャスト PTRと置いてみるとわかりやすいかも
step2 i = *(PTR)となるので、
PRTの指し示す実体をiに代入
int (*fn)(int) = functionの部分はfnの宣言と代入が一緒になっていて、
fn is pointer to 関数(引数が(int)で returning int)
= functionでつかがっテイルので
ポインター fnに 関数functionのアドレスを代入している。
return fn(80486)の部分は、
ポインターfnに引数(80486)を渡しているってことですね。
gas hello.Sにつづく