Temat: Podwójne wskaźniki jako tablice.

Trochę nie rozumiem koncepcji wykorzystywania podwójnych wskaźników jako tablic w ANSI C.

Powiedzmy, że mam jakąś tablicę, ale zapisaną w ten sposób:



char** tablica;



Jak wziąć wartość pierwszego elementu?
Domyślam się, że żeby dostać się do kolejnego elementu tablicy, muszę jakoś inkrementować wskaźnik, ale który, co i jak, tego moja mała główka nie ogarnia.

Wiem, że problem noobski, ale szukam, szukam i znaleźć nie mogę :)

Temat: Podwójne wskaźniki jako tablice.

Ok, sorry, za zaśmiecanie. Pogłówkowałem, pogłówkowałem i zrozumiałem, że to po prostu wskaźnik do tablicy wskaźników na chary, a wskaźniki na chary często używane jako stringi - inkrementacja aż do eof :)

Jeszcze raz sorry.

konto usunięte

Temat: Podwójne wskaźniki jako tablice.

Paweł S.:
Ok, sorry, za zaśmiecanie. Pogłówkowałem, pogłówkowałem i zrozumiałem, że to po prostu wskaźnik do tablicy wskaźników na chary
No to nie zrozumiałeś ;)

char a; //znak
char* b; //wskaznik na znak
char** c; //wskaznik na wskaznik na znak
char d[]; //tablica znakow
char* e[]; //tablica wskaznikow na znaki
char* (*f)[]; // TO jest wskaznik na tablice wskaznikow na znak

//przyklad:
char tab[2][10]; //2 napisy 10cio znakowe
char** tabptr = tab;

**tabptr //pierwszy znak pierwszego napisu
**(tabptr+1) //pierwszy znak drugiego napisu
*(*tabptr+1) //drugi znak pierwszego napisu
*(*(tabptr+1)+1) //drugi znak drugiego napisu


a wskaźniki na chary często używane jako stringi - inkrementacja aż do eof :)
e?
Jeśli masz na myśli iterację (bo inkrementacja czego?) po znakach napisu to jeśli już, to najczęściej są to tzw. null terminated strings, czyli kończące się znakiem zerowym (\0) a nie eof(bo co ma "end of file" do tablic znaków?).

Temat: Podwójne wskaźniki jako tablice.

Zrozumiałem, bo działa tak jak powinno, być może niejasno się wyraziłem. Mam na myśli inkrementację wskaźnika - wskaźnik++.

Stringi w ANSI C przechowywane są w postaci następujących po sobie w pamięci bajtów reprezentujących znaki w ASCII i zakończonych znakiem EOF. Tak więc mając wskaźnik na pierwszy znak łańcucha, możemy go inkrementować aż do momentu, kiedy *wskaźnik == EOF, aby odczytać całego stringa.

Wskaźnik na wskaźnik do char jest więc w istocie wskaźnikiem na tablicę stringów (jeśli oczywiście pamięć na nie została odpowiednio zaalokowana). Inkrementując wskaźnik pierwszego rzędu "chodzimy" po tablicy stringów (dokładnie rzecz biorąc po wskaźnikach do pierwszych znaków każdego z nich). Inkrementując wskaźniki drugiego rzędu "chodzimy" po poszczególnych znakach tego stringa, ale tego ręcznie robić nie musimy, bo to już za nas robią funkcje te stringi wykorzystujące (np. printf przyjmujące wskaźniki na zmienne dowolnego typu, w tym char).
L P

L P podskala.net

Temat: Podwójne wskaźniki jako tablice.

Paweł S.:
Stringi w ANSI C przechowywane są w postaci następujących po sobie w pamięci bajtów reprezentujących znaki w ASCII i zakończonych znakiem EOF. Tak więc mając wskaźnik na pierwszy znak łańcucha, możemy go inkrementować aż do momentu, kiedy *wskaźnik == EOF, aby odczytać całego stringa.

Tak jak Krzysztof Ci podpowiedział, tablica "czarów" jest najczęściej terminowana znakiem '\0' (do tych "innych" sytuacji bardziej pasuje zastosowanie typu unsigned char(*), tzw. typu binarnego). Funkcja "printf", którą dałeś za przykład, dla formatu "%s" oczekuje ciągu zanków z terminującym zerem - jestem bardziej niż pewien.

EOF, tj. End Of File, jest znakiem sygnalizującym koniec pliku i nie można tego ot tak mieszać. Polecam zastosowanie '\0' jeśli to jest typ char(*).

Ps.: Podwójny wskaźnik nie musi być tablicą. Może być to zwyczajnie wskaźnik na adres innego wskaźnika tego samego typu. Powodzenie w dalszej eksploracji tematu.

konto usunięte

Temat: Podwójne wskaźniki jako tablice.

Paweł S.:
Zrozumiałem, bo działa tak jak powinno, być może niejasno się wyraziłem. Mam na myśli inkrementację wskaźnika - wskaźnik++.

Stringi w ANSI C przechowywane są w postaci następujących po sobie w pamięci bajtów reprezentujących znaki w ASCII i zakończonych znakiem EOF. Tak więc mając wskaźnik na pierwszy znak łańcucha, możemy go inkrementować aż do momentu, kiedy *wskaźnik == EOF, aby odczytać całego stringa.

Nie wiem co rozumiesz przez EOF, ale:
- w C łańcuchy kończą się znakiem '\0'
- '\0' = 0 = ASCII NUL

http://www.asciitable.com/

Określenie końca tablicy wskaźników też można różnie zrobić - np. przez wybraną wartość (NULL) lub przez podanie jej rozmiaru.
Wskaźnik na wskaźnik do char jest więc w istocie wskaźnikiem na tablicę stringów (jeśli oczywiście pamięć na nie została odpowiednio zaalokowana). Inkrementując wskaźnik pierwszego rzędu "chodzimy" po tablicy stringów (dokładnie rzecz biorąc po wskaźnikach do pierwszych znaków każdego z nich). Inkrementując wskaźniki drugiego rzędu "chodzimy" po poszczególnych znakach tego stringa, ale tego ręcznie robić nie musimy, bo to już za nas robią funkcje te stringi wykorzystujące (np. printf przyjmujące wskaźniki na zmienne dowolnego typu, w tym char).

Zgadza się.Piotr L. edytował(a) ten post dnia 11.05.12 o godzinie 10:30

Temat: Podwójne wskaźniki jako tablice.

Sorry, fakt, EOF to nie było dobre porównanie, spałem już jak to pisałem xD

Następna dyskusja:

Kto poszukuje pracy jako pr...




Wyślij zaproszenie do