[C] Co zyskuje na podwójnym i potrójnym wskaźniku?


(Quatre050) #1

WItam!

1.Ostatnio w liceum mieliśmy zajęcia z C. Była mowa o wskażnikach. Nauczyciel wprawdzie wspomniał o wskaźnikach podwójnych i potrójnych, ale na moje pytanie co przez to zyskujemy nie odpowiedział. Więc zadaje pytanie to wam.

  1. Czy pisząc i używając czegoś takiego:

    char cTab[9]={0}

    char* pcTab=&cTab

zyskuje jakąś optymalizację względem tego:

char cTab[9]={0}

?


(Enterbios) #2

Nie optymalizację ale możliwości. pcTab możesz przesuwać, cTab jest stały - taki wskaźnik którego nie możesz przesuwać.


(Rolek0) #3

:arrow: http://www.youtube.com/watch?v=bewTJaboGIw, http://www.youtube.com/watch?v=1I0ObS-RQvQ, http://www.youtube.com/watch?v=ICrBkVxkdVI, http://www.youtube.com/watch?v=mqCULVvaS1c, http://www.youtube.com/watch?v=YvA8tNm0FbA, http://www.youtube.com/watch?v=B7x-RWNGhgc, http://www.youtube.com/watch?v=_5pfrvlY_cA, http://www.youtube.com/watch?v=OuJMvfwblb0,


(Marcinch7) #4

To zmień nauczyciela. Musisz zrozumieć najpierw zasadę działania wskaźników i to jak działają w praktyce, bo patrząc na post to chyba ten wasz nauczyciel uczy samej teorii czyli nie musicie rozumieć tylko znać teorię.

Kod w podpunkcie 2. jest bez sensu.

Odpowiadając na pytanie o optymalizacje - nie, nie daje to żadnej optymalizacji w tym przypadku.


(Pablo_Wawa) #5

Bo pcTab to wskaźnik do tablicy, która w C też jest reprezentowana jako wskaźnik do ciągu znaków/elementów. Stąd nazwa podwójny wskaźnik.

Takim podwójnym wskaźnikiem możesz wygodniej iterować elementy tablicy (*pcTab='0' zamiast cTab_='0')._

Potrójny wskaźnik dotyczy się zapewne tablic wielowymiarowych (i daje analogiczną wygodę).


(Rolek0) #6

Tablica w C to tablica. Przy czym może być ona niejawnie konwertowana na wskaźnik do swojego pierwszego elementu, co jest często wykorzystywane.

Tablica wielowymiarowa to tablica, której elementami są tablice. Tablica wskaźników to zupełnie inna struktura danych, nie tylko semantycznie ale przede wszystkim pod względem technicznym.

Właściwie nie ma czegoś takiego jak 'wielokrotny wskaźnik'. Po prostu wskaźnik może wskazywać również na inny wskaźnik.


(linux_to_syf_^^) #7

Świetnie. Nikt nie zauważył, że żaden kompilator tego nie puści przez niezgodność typów. Heh.


(Rolek0) #8

Najpierw nie puści za brak średników, ale nie o to chodzi w tym temacie :stuck_out_tongue:


(linux_to_syf_^^) #9

Akurat typy są dość ważne przy operacjach na wskaźnikach. A akurat to co napisał autor, nie ma nic wspólnego z poprawnym kodem :wink:.


(Marcinch7) #10

Już to napisałem wyżej...


(Spam) #11

Przykład: funkcja ma za zadanie zmodyfikować wskaźnik. Jeśli przekażesz jej wskaźnik, to zmodyfikuje lokalną kopię. Potrzebny więc wskaźnik do wskaźnika. Inny przykład: tablica łańcuchów znakowych, albo tablice wielowymiarowe.


(Johny) #12

Wskażnik to zmienna,która przechowuje adres pamięci,elementy tablicy są wskazywane *tab(początek+i)

tab[0]=*tab(początek+0);

tab[1]=*tab(początek+1);

Gdy chcesz odczytać tab(n) wykonywana jest operacja *tab(początek+n);

Obsługa kilkuwymiarowych tablic sprowadza się do *tab(początek+i+j) lub *tab(początek+i*j)

Teksty są też tablicami,wskażnik daje większą kontrolę przy dostępie do tablic,tylko trzeba umieć wyłapać zapis poza obszar pamięci,czyli w tym wypadku wyłapać adres wyjeżdzający poza tekst.

Przy pomocy wskażników możesz tworzyć tzw. zmienne dynamiczne,zmienne te mogą być tworzone i niszczone w trakcie działania programu,gdy stworzysz zwykłego int'a,to ten int jest niszczony dopiero przy wyjściu z funkcji,poczytaj o zmiennych dynamicznych,funkcjach new i delete.Wskażniki mają zastosowanie z listami jedno lub wielokierunkowymi,to takie struktury w których wskażnik wskazuje adres następnego elementu listy,dają wtedy oszczędność pamięci,bo zamiast na stałę deklarować np. tysiąc elementową tablicę,gdzie większość wartości będzie zerami,deklarujemy tyle ile nam w danej chwili potrzeba,a potem dokładamy nowe elementy.


(Rolek0) #13

Dla k-wymiarowej tablicy o wymiarach n1, n2, ..., nk oraz indeksach i1, i2, ..., ik, byłoby to raczej i1 + n1*i2 + n1*n2*i3 + ... + n1*n2*...*nk-1*ik (opcjonalnie odwrotnie w zależności, od której strony liczyć wymiary).

Dla 2-wymiarowej tablicy o "szerokości" w oraz indeksach: "poziomym" x i "pionowym" y jest to x + y * w, przy czym tablica ta jest tablicą o wielkości h tablic o wielkości w. W przypadku tablicy o wielkości w tablic o wielkości h wzór ma postać x * h + y, co wychodzi na dokładnie to samo tylko oznaczenia się zmieniają zależnie od przyjętej koncepcji.


(Johny) #14

Zależy jak te elementy są rozmieszczone