c: lors de l’utilisation d’un pointeur en tant qu’entrée dans une fonction incrémentant la valeur des pointeurs en utilisant * pointeur ++ ne fonctionne pas

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.