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につづく