qual è la differenza tra la definizione di char a e char (* a) ?

Voglio solo assicurarmi la differenza tra * a [5] e (* a) [5] in linguaggio C.

So che * a [5] significa che l’array a può avere cinque elementi e ogni elemento è puntatore. così,

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

Ha senso.

Ma quando ho cambiato *a[5] a (*a)[5] non funziona.

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

Cosa significa esattamente (*a)[5] ?


Inoltre,

C’è qualche differenza tra *a[5] e a[5][] , e (*a)[5] e a[][5] ?

Esiste un ottimo sito Web che decodifica tali prototipi: 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 

Sono diversi tipi:

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

Nel primo esempio hai una matrice di puntatori perché le parentesi hanno la precedenza durante l’analisi. Inserendo l’asterisco tra parentesi si sostituisce questo e si pone esplicitamente il puntatore con precedenza più alta.

Si utilizzano le parentesi per rendere il puntatore designatore * “più vicino” alla variabile, che altera il significato della dichiarazione: anziché un array di puntatori, si ottiene un singolo puntatore a un array.

Ecco come puoi usarlo:

 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]); 

Nota che il compilatore sa che punta ad un array:

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

Demo su ideone.

char *a[5];
creare una serie di 5 puntatori per char

printf("%c",*a[5])
a è una matrice di indicatori
quindi questa espressione significa stampare il sesto valore del carattere dell’elemento a cui punta a[5] .

char (*a)[5]
crea una matrice di 5 caratteri e assegna l’indirizzo del primo elemento di questo array creato

printf("%c",(*a)[5])
a punto al primo elemento di una matrice di caratteri
Quindi questa espressione significa stampare il sesto valore dell’elemento char dell’array a cui punta.