2017-01-26 2 views
0

C код для демонстрации использования указателей функций.Может ли кто-нибудь объяснить мне этот код?

#include<stdio.h> 
struct geoobject 
{ 
     enum{CIR=0,REC,TRG}gcode; 
     union 
     { 
       struct cir{double x,y,r;}c; 
       struct rec{double x,y,w,h;}r; 
       struct trg{double x,y,b,h;}t; 
     }; 
}; 
typedef void(*DrawFunc)(struct geoobject); 

Typedefed указатель функции.

void drawcir(struct geoobject go) 
{ 
     printf("Circle:(%lf,%lf,%lf)\n",go.c.x,go.c.y,go.c.r); 
} 
void drawrec(struct geoobject go) 
{ 
     printf("Rec:(%lf,%lf,%lf,%lf)\n",go.r.x,go.r.y,go.r.w,go.r.h); 
} 
void drawtrg(struct geoobject go) 
{ 
     printf("Triangle:(%lf,%lf,%lf,%lf)\n",go.t.x,go.t.y,go.t.b,go.t.h); 
} 
DrawFunc DrawArr[]={drawcir,drawrec,drawtrg}; 
int main(void) 
{ 
     struct geoobject go; 
     go.gcode=CIR; 
     go.c.x=2.3;go.c.y=3.6;go.c.r=1.2; 
     DrawArr[go.gcode](go); 
     go.gcode=REC; 
     go.r.x=4.5;go.r.y=1.9;go.r.w=4.2;go.r.h=3.8; 
     DrawArr[go.gcode](go); 
     go.gcode=TRG; 
     go.t.x=3.1;go.t.y=2.8;go.t.b=4.4;go.t.h=2.7; 
     DrawArr[go.gcode](go); 
     return 0; 
} 

Confused с ЬурейеЙ пустотой (* DrawFunc) (структура geoobject) и его использованием в program.Please объяснить.

+1

«Пожалуйста, объясните», это далеко не единственный вопрос *. VTC слишком широк. –

+0

возможно, это будет полезно: http://www.cprogramming.com/tutorial/function-pointers.html – yano

ответ

1

typedef void(*DrawFunc)(struct geoobject) означает, что Drawfunc теперь typdef (или имя/псевдоним) указателя на функцию, которая принимает в качестве аргумента struct geoobject и возвращения недействительными.

В программе, массив указателей на функции объявляется:

DrawFunc DrawArr[]={drawcir,drawrec,drawtrg}; 

Все три функции drawcir(), drawrec() и drawtrg() соблюдать определение ЬурейеЕ DrawFunc и может быть совмещенным как таковой ,

Смежные вопросы