Pourquoi scanf a-t-il besoin de &?

Je veux lire un numéro de stdin. Je ne comprends pas pourquoi scanf nécessite l’utilisation de & avant le nom de ma variable:

 int i; scanf("%d", &i); 

Pourquoi scanf t-il besoin de l’adresse de la variable?

Il faut changer la variable. Comme tous les arguments en C sont passés par valeur, vous devez passer un pointeur si vous voulez qu’une fonction puisse changer un paramètre.

Voici un exemple très simple le montrant:

 void nochange(int var) { // Here, var is a copy of the original number. &var != &value var = 1337; } void change(int *var) { // Here, var is a pointer to the original number. var == &value // Writing to `*var` modifies the variable the pointer points to *var = 1337; } int main() { int value = 42; nochange(value); change(&value); return 0; } 

Les parameters de la fonction C sont toujours “passage par valeur”, ce qui signifie que la fonction scanf ne voit qu’une copie de la valeur actuelle de tout ce que vous spécifiez comme expression d’argument.

Dans ce cas, &i est une valeur de pointeur qui fait référence à la variable i . scanf peut utiliser ceci pour modifier i . Si vous passiez i , alors il ne verrait qu’une valeur non initialisée, qui (a) est UB, (b) n’est pas une information suffisante pour que scanf sache comment modifier i .

Ce n’est pas nécessaire.

 char s[1234]; scanf("%s", s); 

Fonctionne très bien sans un & n’importe où. Ce dont scanf et l’entreprise ont besoin sont des pointeurs . Pour lui permettre de modifier une variable particulière, vous transmettez l’adresse de cette variable. Pour quelques types, cela se produit par défaut. Pour d’autres, vous utilisez & pour prendre l’adresse (obtenez un pointeur sur cette variable).

Parce que sinon, cela ne ferait que modifier une copie plutôt que l’original.

scanf requirejs l’opérateur addressOf (&) car il prend un pointeur en argument. Par conséquent, pour que la variable soit définie sur une valeur passée, vous devez créer un pointeur à partir de la variable afin de pouvoir la modifier.

La raison pour laquelle un pointeur doit être passé à scanf est que si vous venez de passer une variable, vous ne pourrez pas modifier directement la variable dans scanf, vous ne pouvez donc pas le définir sur la valeur lue par scanf.

J’espère que cela t’aides.

scanf() stocke les valeurs, il a donc besoin d’un emplacement pour les stocker.
Pour ce faire, addressof les adresses (en pointeurs) de l’emplacement de stockage des valeurs à l’aide de l’ addressof ou de l’ addressof & (esperluette).

sscanf ne nécessite pas &

 int decimal; int *pointer = &decimal; scanf("%d", pointer); 

le code ci-dessus est valide