Beaucoup de confusion au sujet de C les pointeurs vient d'un très mauvais choix qui a été à l'origine concernant le style de codage, corroborée par une très mauvaise peu de choix dans la syntaxe de la langue.
int *x = NULL;
est C correct, mais il est très trompeur, je dirais même absurde, et il a gêné la compréhension de la langue pour beaucoup de novices. Cela nous permet de penser que, plus tard, nous avons pu faire *x = NULL;
ce qui est évidemment impossible. Vous voyez, le type de la variable n'est pas int
, et le nom de la variable n'est pas *x
, ni ne l' *
dans la déclaration de jouer un rôle fonctionnel dans la collaboration avec l' =
. C'est purement déclaratif. Donc, ce qui fait beaucoup plus de sens est ceci:
int* x = NULL;
qui est également correcte C, mais il n'adhère pas à l'origine de K&R style de codage. Il rend parfaitement clair que le type est - int*
, et le pointeur est une variable x
, de sorte qu'il devient clairement évident, même pour les non-initiés que la valeur NULL
est stocké dans x
, ce qui est un pointeur vers int
.
En outre, il est plus facile de tirer une règle: quand la star est loin de la variable nom, alors c'est une déclaration, tandis que l'étoile est attaché le nom est un déréférencement du pointeur.
Alors, maintenant, il devient beaucoup plus compréhensible que plus bas, nous pouvons soit nous n' x = NULL;
ou *x = 2;
, en d'autres termes, il rend plus facile pour un novice de voir comment variable = expression
entraîne pointer-type variable = pointer-expression
et dereferenced-pointer-variable = expression
. (Pour les initiés, par "l'expression", je veux dire "rvalue'.)
Le mauvais choix dans la syntaxe de la langue, c'est que lors de la déclaration de variables locales que vous pouvez dire int i, *p;
qui déclare un entier et un pointeur vers un entier, cela conduit à penser que l' *
est une partie utile de ce nom. Mais il n'est pas, et cette syntaxe est juste une étrange cas particulier, ajouté à des fins de commodité, et à mon avis il n'aurait jamais existé, parce qu'il invalide la règle que j'ai proposé ci-dessus. Autant que je sache, nulle part ailleurs dans la langue est cette syntaxe de sens, mais même si elle l'est, c'points de divergence dans la façon dont les types de pointeur sont définies dans le C. Partout ailleurs, dans une seule des déclarations de variable, dans la liste des paramètres, les membres de la structure, etc. vous pouvez déclarer votre pointeur en tant que type* pointer-variable
au lieu de type *pointer-variable
; il est parfaitement légal et fait plus de sens.