ďťż

Ładny brzuch

Witam wszystkich serdecznie! Mam kilka pytan do ludzi ktorzy sie na tym znaja, mianowicie ogladalem ostatno kod programu napisanego w c. Znalazlem w nim deklaracje takiej struktury:
struct osoba{ char nazwisko[MAX]; int wiek; };

oraz typow:
typedef struct osoba DANE; typedef DANE* BAZA;
Co oznacza ta druga instrukcja, nie wiem o co chodzi z ta gwiazdka zaraz po "DANE" czy nie powinna ona byc zaraz przed slowem "BAZA"?

Ogladajac dalej kod napotkalem deklracje takiej funkcji:
void wyswietlbaze(DANE **b,int max);
Co oznaczaja te 2 gwiazdki przed litera "b" w parametrze funkcji?

Zgory dziekuje za wszelka pomoc i pozdrawiam :)



W tym wypadku jedna * to wskaźnik, a ** to wskaźnik na wskaźnik. Najlepiej sam sobie o tym poczytaj bo bez znajomości wskaźników w C daleko się nie zajedzie :). Na razie powiem tylko tyle, że zapis:typedef DANE* BAZA;Pozwoli Ci stworzyć dynamiczną tablicę czyli taką której rozmiar ustalasz w czasie działania programu, a nie przy jego kompilacji.
Użytkownik reVis edytował ten post 24 luty 2008, 13:37
Tak jak napisał reVis, * to wskaźnik, czyli możesz np. tworzyć dynamicznie tablicę czy jakąś zmienną.

Zapis void wyswietlbaze(DANE **b,int max); oznacza, że 1 argument funkcji to 2 wymiarowa tablica(następnie w kodzie się odwołujesz b[0][0] itp.),
void wyswietlbaze(DANE *b,int max); znaczy że pobierasz tablice 1-wymiarową itd.

BTW, rzeczywiście poczytaj trochę o wskaźnikach, przyda Ci się to później.

EDIT: literówka;)
Użytkownik Tomek92 edytował ten post 24 luty 2008, 16:24
dzieki wielkie juz troche zaczailem umiem torche wskazniki ale mam problem wlasnie z tymi "tablicami dwuwymiarowymi"




Co oznacza ta druga instrukcja, nie wiem o co chodzi z ta gwiazdka zaraz po "DANE" czy nie powinna ona byc zaraz przed slowem "BAZA"? Możemy to zapisac jak nam się podoba. Tak: typedef DANE* BAZA; tak: typedef DANE * BAZA; lub tak: typedef DANE *BAZA;. Położenie gwiazdki nie ma znaczenia :)


Pozwoli Ci stworzyć dynamiczną tablicę czyli taką której rozmiar ustalasz w czasie działania programu, a nie przy jego kompilacji. Nie da się zrobic dynamicznej tablicy w ten sposób. Rozmiar musi byc znany w czasie kompilacji, inaczej będziemy sobie radośnie pisac po czyjeś pamięci i program nam się w najlepszym przypadku wykrzaczy ;)


oznacza, że 1 argument funkcji to 2 wymiarowa tablica(następnie w kodzie się odwołujesz b[0][0] itp.), Oznacza, że to wskaźnik na wskaźnik, a nie dwuwymiarowa tablica. Tablicę dwu i więcej wymiarową możemy "zrobic" tak samo jednym wskaźnikiem :)


Nie da się zrobic dynamicznej tablicy w ten sposób. Rozmiar musi byc znany w czasie kompilacji, inaczej będziemy sobie radośnie pisac po czyjeś pamięci i program nam się w najlepszym przypadku wykrzaczy ;)
jak to nie :> wystarczy pozniej do takiego wskaznika zaalokowac odpowiednia ilosc pamieci przez malloc.

Oczywiście. Ale sam wskaźnik nie daje takiej możliwości i możemy co najwyżej uzyskać jakiś ACCESS VIOLATION, czy inne cudo :)

No i nie wiem skąd informacje, że DANE **b to tablica dwuelementowa... Uśmiechnąłem się :)

Może źle się wyraziłem, ale przyznacie że jeśli da się taki argument to efektem jest tablica:P

Owszem, nie jest to całkiem dobre stwierdzenia, lecz jeśli maciaszek nie rozumie wskaźników to Wasz opis jeszcze mniej mu da:) Po prostu wskaźnik na wskaźnik jako argument traktujemy jak tablicę. Uwierz, niejeden program napisałem. Poza tym jak Lupinek zauważyłeś(mam nadzieję) na początku przyłączyłem się do postu reVis'a tylko chciałem go uzupełnić tak, żeby maciaszek mógł już wykorzystać kod który widział. A radę związaną z poczytaniem o wskaźnikach też nie umieściłem bez powodów.
Z żadnego stwierdzenia nie mam powodów się wycofywać, najwyżej uzupełnić co uczyniłem.

EDYCJA:
@powyżej oba:
Masz rację Lupinek. tylko jak wytłumaczysz kod np:
void sortuj(int *tab, int size){ (...) //np: int x = tab[0]; }
albo ten na stronie http://pl.wikipedia....ezentacja_grafu? Dobra, przyznałem że stwierdzenie nie jest poprawne, ale tak po prostu działa. Jak jakieś wątpliwości, to napisz to wszystkich edytujących artykuł z Wikipedii oraz Redakcji, która podobny kod stosowała(pierwszy) :)

Podsumowując, stwierdzenie teoretycznie niepoprawne, ale w praktyce dobrze funkcjonuje. Wykładów nie musisz robić, ja wiem co to wskaźniki, ale funkcjonalności nie zaprzeczysz. A na stwierdzenie Tablicę dwu i więcej wymiarową możemy "zrobic" tak samo jednym wskaźnikiem można podkopać właśnie kodem z Wiki.

Myślę, że to koniec dyskusji, bo wiadomo co było niepoprawnego(moja definicja) ale i wątpliwości co do funkcjonalności powinny być rozwiane(pod jest sprawny).

PS. wiem, że kod z Wiki to klasa nie funkcja ale chodzi o przykład, nie czepiajcie się szczegółów że klasę i funkcję trochę (mocno) różni :)
Użytkownik Tomek92 edytował ten post 01 marzec 2008, 19:02
Kiedy wysyłamy do funkcji wskaźnik, mamy możliwość modyfikacji wartości na jaką wskazuje (taki jest jego cel), ale nie możemy zmodyfikować samego wskaźnika. Dlaczego? Otóż dzieje się z nim tak samo, jak wtedy, gdy jako argument funkcji damy wartość - robiona jest jej kopia, wewnątrz funkcji robimy z nią co chcemy i nie ma to nic wspólnego z oryginalnym elementem. Tak samo w tym wypadku - robiona jest kopia wskaźnika, którą możemy sobie zmieniać, ale nie wpływa to na oryginalny wskaźnik (oczywiście wartość na którą wskazuje zmienić możemy - nie zamotałem jeszcze?).
Ale co w sytuacji, gdy wewnątrz funkcji chcemy zmienić np. adres, na który wskazuje wskaźnik? Wtedy z pomocą przychodzi nam właśnie wskaźnik do wskaźnika! Jeśli do funkcji wyślemy wskaźnik (A) do wskaźnika (B), to możemy modyfikować jego wartość (którą jest B), a tym samym - wskaźnik B.

zapis **b nie oznacza tablicy dwuwymiarowej. To wskaźnik do wskaźnika - i wyjaśniłem do czego może służyć.
Jakieś pytania? ;]

@down - racja, mój błąd, dwuwymiarowej i o to mi chodziło :)
I tak, Radku, to rzeczywiście prawie to samo.
Użytkownik Lupinek edytował ten post 01 marzec 2008, 16:20
Oj, Lupinek, Lupinek - po pierwsze: nie dwuelementowej, a dwu wymiarowej, a po drugie: co za różnica czy to wskaźnik do wskaźnika, czy tablica wskaźników. I tak sobie wyłuskamy co nam będzie pasowało... :)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •