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 |