tworzenie dynamicznej tablicy wskaźników

tworzenie dynamicznej tablicy wskaźników
robcio
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Opole
  • Postów: 533
0

Otóż mam dwa zapisy:

Kopiuj
	char * fun[] = new char*[100];
	char ** fun2 = new char*[100];
 

Ten pierwszy jest niepoprawny a ten drugi poprawny. Moje pytanie dlaczego?
Przecież zapis char * nazwa[] i char **nazwa niczym się nie różni od siebie. W obu przypadkach mamy do czynienia z tablicą wskaźników o nieokreślonej liczbie elementów.
Oba zapisy:

Kopiuj
 
int main(int argc, char * argv[])
int main(int argc, char ** argv)

są przecież poprawne. Tzn jednoznaczne.

MA
  • Rejestracja: dni
  • Ostatnio: dni
0

main.cpp|26|error: initializer fails to determine size of 'fun'|

Endrju
  • Rejestracja: dni
  • Ostatnio: dni
1

To nie jest to samo. Podczas przekazywania tablicy do funkcji jest ona redukowana do wskaźnika na pierwszy element, dlatego to, że użyjesz tam zapisu [] niczego nie zmienia - tablica zostanie zredukowana i jest to to samo co **. Podczas definicji rozmiar tablicy musi być znany a Ty go nie podajesz. Tablica to nie jest wskaźnik.

Kopiuj
cdecl> explain char * fun[]
declare fun as array of pointer to char
cdecl> explain char ** fun2
declare fun2 as pointer to pointer to char

Widzisz różnicę? Kompilator też ją widzi. Z tym, że array of pointer to char nie może mieć nieznanego rozmiaru.

02
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1176
1

Skladnia do tworzenia zainicjowanej statycznej tablicy 2D:

Kopiuj
int tab[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}}
int *tab[4] = {{a1, a2, a3, a4}, {a5, a6, a7, a8}};

Te dwa przypadki nie sa sobie rownowazne - w pierwszym przypadku mamy wskaznik do tablicy 2D w drugim przypadku mamy wskaznik do tablicy wskaznikow, ktore moga wskazywac na wiersze.

Do tworzenia niezaincjowanej statycznej tablicy 2D mozesz uzyc:

Kopiuj
int tab[2][4];
int *tab[4];

Te dwa przypadki takze nie sa sobie rownowazne (z takiego samego powodu jak poprzednio). Roznia sie od poprzedniego przykladu tym, ze trzeba podac wszystkie wymiary (w pierwszym przykladzie trzeba podac tylko najbardziej "prawy" wymiar i musi byc on staly).

Do tworzenia niezainicjowanej dynamicznej tablicy 2D mozna uzyc:

Kopiuj
int (*tab)[4] = new int[n][4]; //Tutaj najbardziej prawy wymiar tez musi byc staly
int **tab = new int*[n];

Te dwa przypadki nie sa sobie rownowazne. W pierszwym mamy wskaznik na dynamiczna tablice 2D w drugim mamy wskaznik do dynamicznej tablicy wskaznikow.

Teraz jak przekazujemy tablice do funkcji:
Takie zapisy:

Kopiuj
void fun(int** tab)
void fun(int* tab[])
void fun(int* tab[4]) //4 moze byc dowolna inna liczba

dla odmiany sa sobie rownowazne. Do tych funkcji mozesz przekazac tablice wskaznikow. Natomiast taki zapis:

Kopiuj
void fun(int tab[][4]) //trzeba podac najbardziej prawy wymiar

juz nie jest rownowazny poprzednim i oczekuje przekazania tablicy 2D zamiast tablicy wskaznikow.

Podsumowujac tablice dwuwymiarowa i tablica wskaznikow to dwie rozne rzeczy chociaz moga sluzyc do implementacji funkcjonalnie takiego samego kodu. Te rozroznienie musisz uwzgledniac podczas przekazywania obydwu typow tablic do funkcji.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.