Pendant que j’apprenais le C (je suis très nouveau dans ce domaine), je jouais avec des pointeurs. Ici vous pouvez voir mon code:
#include void change(int *i) { *i += 1; } int main() { int num = 3; printf("%d\n", num); change(&num); printf("%d\n", num); return 0; }
Mon but était de remplacer l’incrémentation de la valeur num sans la réaffecter comme ceci:
num = change(num);
C’est pourquoi je passais l’emplacement de num
dans num
utilisant le &
: afin qu’il puisse être utilisé comme pointeur. Avant cette version, tout dans le code était identique. La seule chose qui était différente, c’est que j’ai dit *i++;
au lieu de dire *i += 1;
Maintenant ma question est pourquoi je ne peux pas dire *i++
?
Maintenant ma question est pourquoi je ne peux pas dire * i ++
En raison de la priorité des opérateurs, *i++
est identique à *(i++)
.
*(i++);
est équivalent à:
int* temp = i; // Store the old pointer in a temporary variable. i++; // Increment the pointer *temp; // Dereference the old pointer value, effectively a noop.
Ce n’est pas ce que tu veux. Vous devez utiliser (*i)++
ou ++(*i)
. Celles-ci vont d’abord déréférencer le pointeur, puis incrémenter la valeur de l’object pointé par le pointeur.
Cela est dû à la priorité de l’opérateur .
Vous pouvez voir que “l’incrément postfix” est au niveau de priorité 1, et “Indirection (déréférencement)” au niveau 2 et que le niveau 1 est le premier. Vous devez donc utiliser des crochets pour que la déréférence se produise en premier: (*i)++
.
La différence est que (*i)++
dit de localiser la mémoire indiquée par i
et de l’incrémenter (comme vous le souhaitez). *(i++)
dit que l’incrément i
lui-même (il pointe donc vers l’adresse mémoire suivante ), et déréférencent cela; ce qui est peut-être un no-op, et pas ce que vous voulez.