2012-10-17 4 views
2
int b[3][2] = { {0, 1}, {2, 3}, {4, 5} }; 
int (*bpp)[2] = b; 
int *bp = b[0]; 

Au code ci-dessus: *bpp est-il un pointeur sur un tableau à deux dimensions? Ou un tableau de pointeurs avec la longueur de 2? Pourquoi *bpp est entouré de parenthèses? Y a-t-il une différence entre *bpp[2] et (*bpp)[2]?Tableau de pointeurs en C?

Pendant ce temps, dans le code suivant: (Changer la dimension du tableau)

int i[4] = { 1, 2, 3, 4 }; 
int (*ap)[2] = (int(*)[2])i; 

La deuxième ligne est très déroutant pour moi, surtout le transtypage (int(*)[2]), ce type de données est-il casting exactement?

Merci ^^

Répondre

3

bpp est un pointeur sur un tableau de deux int. *bpp est un tableau de deux int. int *bpp[2] déclarerait bpp comme un tableau de deux pointeurs à int (cette parenthèses en fait un pointeur vers un tableau de deux int).

(int(*)[2]) est un cast en pointeur vers un tableau de deux int.

Ceux-ci peuvent être lus en tenant compte de la règle « déclaration fait suite à l'utilisation » (combinée à la connaissance de la priorité des opérateurs):

dereference (so bpp is a pointer) 
    | 
    v 
int (*bpp)[2] 
^  ^
|   | 
| array index (so the thing that bpp points to is an array) 
| 
the thing on the left is the final type... here it is int, 
so the array is an array of int