Archive for March 26th, 2008

Имената на функциите всъщност били указатели

Wednesday, March 26th, 2008

Днес ни показаха един пиниз, според който имената на функциите в С са всъщност указатели към началния адрес на функцията като алгоритмична структура в кодовия сегмент на програмата. Т.е. като имаш адреса можеш да стартираш функцията.
Ето една програма, която показва файдата от цялата работа:

#include <stdio.h>
int test (int a){
printf(”A: %d\n”,a);
return a;
}
int druga (int a){
printf(”B: %d\n”,a);
return a-1;
}
int plqk (int (*test) (int a)){
printf(”Rez ot test(%d)\n”,(*test) (3));
return 0;
}
int main(void){
plqk(test);
plqk(druga);
plqk(main);
int * p = (int *) test;
printf(”test: %p\n”,test);
printf(”druga: %p\n”,druga);
printf(”p: %p\n”,p);
return 0;
}

За неразбралите - функцията plqk() извиква някоя от другите функции, като точно коя се записва във формалния параметър на бляк() :)