Deklaracja funkcji a w niej &

Jul 25, 2011 11 Replies

Cześć. Nie obrazajcie sie na mnie za te pytania, ale sam nie dojde do tego.



Spotkałem taka "dziwna" deklaracje i definicje funkcji: typedef struct { unsigned char type; unsigned char value; } Event;


void GetEvent( Event & event ) { event.type = TIME_EVENT; event.value = ticks; }


A wywołanie takiej funkcji:



GetEvent( event );


Dlaczego tak przy deklaracji pojawia sie ampersand &?


Doczytaj sobie o metodach przekazywania parametrów (przez referencję).

Piotrek

Ale gdzie. Przegladam wlasnie kilka ksiazek o C i C++ i zadnej nie znalazlem tego. Jesli wiesz w jakiej o tym pisze to daj znac.

A to jest referencja czy przekazanie struktury do funkcji?

Pudło - to jest C++ (ewentualnie C99, ale w każdym razie nie "koszerne" C)

Kiepsko szukałeś. Pierwszy lepszy link prosto z googla

formatting link
Pozdr Portal

Użytkownik "Portal" napisał w wiadomości

A swoja droga - nie uwazacie ze to jakis krok w tyl ? Mozna bylo to samo osiagnac jawnie wskaznikami, a teraz trzeba sie wczytac w funkcje wywolywana, bo nie wiadomo - zmieni nam cos czy nie ma prawa ?

J.

J.F <jfox snipped-for-privacy@poczta.onet.pl> napisał(a):

A przy wskaźnikach nie musiałeś się wczytywać? Różnica jest tylko w momencie patrzenia na wywołanie, gdy nie znasz deklaracji wywoływanej funkcji. A jak znasz i widzisz, że idzie przez referencję to wiesz, że obiekt może być modyfikowany, tak samo jakby szło przez wskaźnik.

Kwestia gustu. Dla ludzi siedzących bardziej w sprzęcie wskaźniki są prostsze do ogarnięcia, bo odnoszą się bezpośrednio do adresów poszczególnych struktur danych w pamięci (przynajmniej tak długo jak się nie używa prawdziwego OSa wprowadzającego wirtualizację). Dla "wysokopoziomowego" software'owca referencje są czystszym mechanizmem, bo odpada cała magia z dereferencją, rzutowaniem i innymi często mało bezpiecznymi konstrukcjami - rzuć takiemu gościowi pomysłem wskaźników do wskaźników albo wskaźników do funkcji i zobaczysz jak się skrzywi ;-). Jedyny problem z C++ jest taki, że wszystkie możliwe mechanizmy przekazywania obiektów lub struktur danych (tzn. przez wartość, wskaźniki lub referencje) są tam dostępne z grubsza na równym poziomie, więc jak się nie rozumie ich specyfiki, to można nieźle się zaplątać. Ale to jest ogólnie cecha języków w których wolno dużo ze strzeleniem sobie w stopę włącznie. A propos, jakby ktoś nie znał:

formatting link
Pozdr Portal

A czy ma tu jakies znaczenie to, ze przekazywana jest struktura zamiast zmiennej?

Użytkownik "Grzegorz Niemirowski" napisał w wiadomości J.F <jfox snipped-for-privacy@poczta.onet.pl> napisał(a):

Nie musialem. Jak jawnie nie przekazywalem adresu tylko "przez wartosc" to mialem pewnosc ze sie nie zmieni :-) A jak przekazywalem adres ... no to wiedzialem ze musze sie liczyc ze zmiana :-)

J.

W dniu 25.07.2011 14:19, J.F pisze:

Bo referencję zazwyczaj łączy się ze słowem "const". Dzięki temu mamy szybkość i zużycie zasobów jak przy wskaźniku, ale mamy ładny zapis i dodatkowo kompilator sprawdza, czy nie próbujemy modyfikować.

Użytkownik "Michoo" napisał w wiadomości grup dyskusyjnych:j0jqtl$sh$ snipped-for-privacy@news.onet.pl...

Tylko ze ja musze zajrzec czy tam jest ten const, a nawet jak jest, to i tak moze zmieniac :)

Co do szybkosci to nie bylbym pewien co szybsze, szczegolnie na jakim x86 .. no chyba ze struktura dluga.

J.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required