Napisałem kod informujący o działaniu wskaźnika funkcji. Uruchomiłem następujący kod C++ na niektórych IDE, wyniki są takie same.Wskaźnik do wskaźnika funkcji w C++
#include "stdafx.h"
int *function(){
static int a=1;
return &a;
}
typedef struct{
int *(*pt_1)();
int *(*pt_2)();
}x_t;
int _tmain(int argc, _TCHAR* argv[])
{
x_t s;
s.pt_1 = function;
s.pt_2 = &function;
printf("%x\n",s.pt_1); //Result: 0x013011a9
printf("%x\n",*s.pt_1); //Result: 0x013011a9
printf("%x\n",**s.pt_1); //Result: 0x013011a9
printf("%x\n",s.pt_1()); //Result: 0x01307000
printf("%x\n",*s.pt_1()); //Result: 1
printf("%x\n",s.pt_2); //Result: 0x013011a9
printf("%x\n",*s.pt_2); //Result: 0x013011a9
printf("%x\n",**s.pt_2); //Result: 0x013011a9
printf("%x\n",s.pt_2()); //Result: 0x01307000
printf("%x\n",*s.pt_2()); //Result: 1
return 0;
}
Moje pytania:
-
- Dlaczego
s.pt_1 == s.pt_2 == *s.pt_1 = **s.pt_1
?
- Dlaczego
-
- Jeżeli adres ma punkt
s.pt_1()
do? Gdzie znajduje się w pamięci?
- Jeżeli adres ma punkt
1, zobacz [to] (http://stackoverflow.com/questions/2795575/how-does-dereferencing-of-a-unction-pointer-happen). 2. 'operator()' wywołuje funkcję, więc pracujesz z jej zwróconym wskaźnikiem. – LogicStuff
Wskaźniki funkcji drukowania według '% x' wywołują niezdefiniowane zachowanie, ponieważ adresy mogą nie pasować do' int'. Użyj 'printf ("% p \ n ", (void *) s.pt_1); ' –
Znalazłem odpowiedź na drugie pytanie tutaj [Gdzie w pamięci są zwracane wartości przechowywane w pamięci?] (http://stackoverflow.com/questions/5472008/where-in-memory-are-return-values -stored-in-memory) –