Archive for March 26th, 2008

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

Wednesday, March 26th, 2008

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

  1.  
  2. #include <stdio.h>
  3. int test (int a){
  4.         printf("A: %d\n",a);
  5.         return a;
  6. }
  7. int druga (int a){
  8.         printf("B: %d\n",a);
  9.         return a-1;
  10. }
  11. int plqk (int (*test) (int a)){
  12.         printf("Rez ot test(%d)\n",(*test) (3));
  13.         return 0;
  14. }
  15. int main(void){
  16.         plqk(test);
  17.         plqk(druga);
  18.         plqk(main);
  19.         int * p = (int *) test;
  20.         printf("test: %p\n",test);
  21.         printf("druga: %p\n",druga);
  22.         printf("p: %p\n",p);
  23.         return 0;
  24. }
  25.  

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