2014-06-07 3 views
5

Chcę tylko upewnić się, że różnica między * a [5] i (* a) [5] w języku C.Jaka jest różnica między definiowaniem char a [5] a char (* a) [5]?

Wiem, że * a [5] oznacza, że ​​tablica a może mieć pięć elementów, a każdy element jest wskaźnikiem. , więc,

char *p = "ptr1"; 
char *p2 = "ptr2"; 
char *a[5] = { p , p2 }; 

Ma sens.

Ale kiedy zmieniłem *a[5] na (*a)[5], to nie działa.

char (*a)[5] = { p , p2}; 

Co dokładnie oznacza (*a)[5]?


Ponadto

jest jakaś różnica między *a[5] i a[5][] i (*a)[5] i a[][5]?

Odpowiedz

3

char *a[5];
utworzyć tablicę 5 wskaźników char

printf("%c",*a[5])
a jest tablicą wskaźników
więc to wyrażenie oznacza druku szósty wartość charakter elementem a[5] wskazuje.

char (*a)[5]
utworzyć tablicę 5 char i przypisać a adres pierwszego elementu tej stworzonej tablicy

printf("%c",(*a)[5])
a punkty do pierwszego elementu tablicy charakteru
więc to wyrażenie środki wypisz szóstą wartość elementu char tablicy, na którą wskazuje a.

5

Są różne typy:

char *a[5]; // array of 5 char pointers. 
char (*a)[5]; // pointer to array of 5 chars. 

W pierwszym przykładzie dostałeś tablicę wskaźników, ponieważ nawiasy mają pierwszeństwo podczas analizowania. Umieszczając gwiazdkę w nawiasie, zastępujesz ją i jawnie umieszczasz wskaźnik o wyższym priorytecie.

+0

należy zauważyć, że PO nie napisał drugiego oświadczenia jako deklaracji, ale jako zlecenie. – user2485710

+0

@ user2485710 tak, myślę, że chciał. W mojej opinii ma to więcej sensu. Tak czy inaczej, amir otrzymał już odpowiedź na drugą sprawę. –

5

użyć nawiasów aby oznacznik wskaźnik * „bliżej” do zmiennej, która zmienia sens deklaracji: zamiast tablicy wskaźników, masz pojedynczy wskaźnik do tablicy.

Oto jak można go używać:

char x[5]={'a','b','c','d','e'}; 
char (*a)[5] = &x; 
printf("%c %c %c %c %c\n", (*a)[0], (*a)[1], (*a)[2], (*a)[3], (*a)[4]); 

Należy zauważyć, że kompilator wie, że a punkty do tablicy:

printf("%z\n", sizeof(*a)); // Prints 5 

Demo on ideone.

6

Świetna strona internetowa istnieje dekoduje takie prototypy: http://cdecl.org/

char *a[5] --> declare a as array 5 of pointer to char 
char a[5][] --> declare a as array 5 of array of char 
char (*a)[5] --> declare a as pointer to array 5 of char 
char a[][5] --> declare a as array of array 5 of char