latajacaryba Temat założony przez niniejszego użytkownika  | 
adres funkcji » 2016-10-10 15:23:22 Witam. Szukałem, ale nigdzie nie mogę znaleźć odpowiedzi. Chciałbym znaleźć adres funkcji: #include <iostream> using namespace std; void funk() {     cout << "funkcja"; } void funk2() {     cout << "funkcja"; } int main()
  {     void( * wsk )() = & funk;     cout << wsk << endl;     wsk = & funk2;     cout << wsk; }
  i teraz pytania: a) dlaczego kiedy piszemy cout<<wsk; pokazuje się '1' a nie jak w innych przypadkach adres funkcji? b) (powiązane) dlaczego musimy użyć '&' żeby wypisać adres?  | 
 | 
mateczek  | 
» 2016-10-10 16:20:10 #include <iostream> using namespace std; void funk() {     cout << "funkcja funk" << endl; } void funk2() {     cout << "funkcja funk2" << endl; } int main()
  {          void( * wsk )();      wsk = funk;     wsk();      wsk = funk2;     wsk(); }
   | 
 | 
Monika90  | 
» 2016-10-10 16:30:35 IOStreams nie potrafi drukować wskaźników do funkcji. Dlatego taki wskaźnik jest konwertowany do bool o wartośći true, a true jest drukowane jako jedynka. Jednak niektóre implementacje C++ pozwalają na rzutowanie wskaźników do funkcji na jakiś inny typ wskaźnikowy, więc można wydrukować wskaźnik do funkcji w taki sposób: int main() {     void( * wsk )() = funk;     cout << reinterpret_cast < void *>( wsk ) << endl;     cout << reinterpret_cast < void *>( funk2 ); }
   | 
 | 
latajacaryba Temat założony przez niniejszego użytkownika  | 
» 2016-10-10 16:50:05 Dzięki, ale jednej rzeczy nie rozumiem: "rzutowanie na inny typ wskaźników" Inny w jakim sensie? void( * wsk )() = funk; cout << reinterpret_cast < void *>( wsk ) << endl; cout << reinterpret_cast < void *>( funk2 );
  Przecież tu wskaźnik jest wskaźnikiem do funkcji typu void, czyli jego typ to void. Skoro tak, to dlaczego rzutujemy  cout << reinterpret_cast < void *>( wsk ) << endl;  na typ void*? Ps. co w takim razie oznacza ten zapis (on już zwraca jakiś adres): void( * wsk2 )(); void( * wsk )() = funk; cout <<& wsk;
   | 
 | 
Rashmistrz  | 
» 2016-10-10 16:51:10 | Przecież tu wskaźnik jest wskaźnikiem do funkcji typu void, czyli jego typ to void. |  
 VOID, że co? Typ  void(*)() jest zupełnie czym innym niż typ  void* czy samego  void! EDIT:Przeniosłem swoje pytanie do osobnego tematu: adres adresu funkcji | 
 | 
Monika90  | 
» 2016-10-10 17:11:55 Typ zwracany z funkcji a typ funkcji to nie to samo. Dla przykładu, typem funkcji  f zdefiniowanej tak float f(int, int) {     return 0; }
 jest  float (int, int), typem wskaźnika do tej funkcji jest  float (*)(int, int) Ps. co w takim razie oznacza ten zapis (on już zwraca jakiś adres):
 void( * wsk2 )(); void( * wsk )() = funk; cout <<& wsk;
   |  
 To jest adres zmiennej  wsk | 
 | 
latajacaryba Temat założony przez niniejszego użytkownika  | 
» 2016-10-10 17:25:52 Aha! a więc to:  float (*nazwa)(int, int) jest typem :)  Super, dziękuję za wyjaśnienie. Tematu jeszcze nie zamykam, bo Rachmistrz o coś się tam pytał.  | 
 | 
latajacaryba Temat założony przez niniejszego użytkownika  | 
» 2016-10-10 17:41:25 Przypomniałem sobie, o jeszcze czymś. Co właściwie w tym przypadku oznacza ten zapis: cout << reinterpret_cast < void *>( wsk ) << endl;
  bo przecież typ void nie może przechowywać znaków itp. więc dlaczego rzutujemy na typ void* a nie np. int* ?  | 
 | 
|  « 1 »  2 |