/ / C, Dynamiczna alokacja macierzy: Dlaczego nie jest to dozwolone? - c, wskaźniki, tablica wielowymiarowa, wskaźnik do wskaźnika, rozpad

C, Dynamiczna alokacja macierzy: Dlaczego nie jest to dozwolone? - c, wskaźniki, tablica wielowymiarowa, wskaźnik do wskaźnika, zanik

Mam więc następujący przykład w niektórych notatkach z wykładów

void f(int **p){}
void g(int *p[]){}
void h(int p[2][3]){}

int main(){
int **a;
allocate_mem(a); // allocate memory for a
f(a); // OK!
g(a); // OK!
// h(a); // NOT OK
int b[2][3];
// f(b); // NOT OK
// g(b); // NOT OK
h(b); // OK!
return 0;
}

(bez dalszych wyjaśnień / komentarzy). Staram się zrozumieć, dlaczego f (b) i g (b) byłyby nielegalne. Obie te funkcje są zaprojektowane do akceptowania tablic dwuwymiarowych i nazywamy je jedną. Jak to nie działa? Zakładam, że różnica polega na alokacji pamięci, ale jak wpłynęłoby to na to, jak funkcja przyjmuje ją jako dane wejściowe?

Odpowiedzi:

2 dla odpowiedzi № 1

Łączymy wskaźniki z tablicami i wskaźnikami do wskaźników z dwuwymiarowymi tablicami.

To zrozumiały błąd z powodu C (iC ++) „s” zanik tablicy do wskaźnika ”. Czasami można odwołać się do tablicy i uzyskać wskaźnik do jej pierwszego elementu; czasami jest to rzeczywista tablica - zależy od kontekstu. A dzięki dwuwymiarowym tablicom robi się jeszcze dziwniej, ponieważ można użyć dwuwymiarowych tablic mniej miejsc zamiast wskaźnika do wskaźnika na element (ale nadal można go używać w trochę takie miejsca).

Poświęć kilka minut na przeczytanie, w jaki sposób wskaźniki i tablice odnoszą się i różnią się w Sekcja 6 FAQ języka C. Pojawi się tam również twoje konkretne pytanie:

P 6.18: „Mój kompilator skarżył się, gdy przekazałem tablicę dwuwymiarową do funkcji oczekującej wskaźnika na wskaźnik”.