Sally (./114) :
Vaguement, oui, mais c'est moins cohérent... Je comprends ce que tu veux dire, à savoir qu'après cette déclaration, « *a » aura toujours le type entier, mais la variable que tu déclares c'est a, pas *a ; ce dernier c'est le résultat d'une opération. Alors il se trouve que c'est pas n'importe quelle opération et que si tu connais le type de *a tu peux en déduire le type de a, mais déclarer que « la case mémoire vers où pointe a contient un entier » est un peu bizarre dans la mesure où a ne pointe pas toujours vers la même case mémoire (et au moment de la déclaration ne pointe vers rien du tout). L'effet de la déclaration est bien de dire que « a contient l'adresse d'un entier », pas autre chose.
Mais "la case mémoire vers où pointe a contient un entier" est bien l'idée du C, ça fait partie du concept "on déclare les variables comme on les utilise". C'est pour ça aussi qu'un pointeur sur un tableau se déclare
int (*foo)[10];: pour accéder à
foo, il faut d'abord déréférencer un pointeur, puis prendre un élément, donc c'est comme ça qu'on déclare le type. L'idée est bien "
(*foo)[10] est de type
int", même si évidemment on n'a pas le droit d'accéder à l'élément
[10] du tableau.