salut les devloppeurs
j'ai une question simple et directe:
pour quoi à la lecture d'une chaine de caractére le & n'est pas utilisé??
merci
salut les devloppeurs
j'ai une question simple et directe:
pour quoi à la lecture d'une chaine de caractére le & n'est pas utilisé??
merci
Bonjour,
Tu parles certainement de l'utilisation du scanf("%s',buffer).
L'esperluette que l'on place devant une l-value, permet de fournir l'adresse de l'élément. scanf comme toutes les fonction ne peut modifier une variable qu'en utilisant l'adresse.
Quand on a à faire à un tableau, le nom du tableau est automatiquement compris comme l'adresse du premier élément, et c'zst zxactement ce dont on a besoin. Mais on peut aussi faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part scanf( "%s" , &buffer[0] );
je savais que le & est utilisé pour l'adresse mais est ce que ca s'utilise pour recupérer l'adresse allouée à la variable(lors de sa déclaration) ou bien le & permet d'allouer une case mémoire???
Bonsoir,
Le « & », en C, n'alloue rien du tout. Quand il est utilisé comme préfixe d'un identifiant, il sert à obtenir l'adresse en mémoire de l'objet concerné. C'est utile quand on veut remplir cet objet avec une donnée, comme dans le cas de scanf().
Lorsque tu lis une chaîne de caractères, la fonction doit déposer celle-ci dans une suite d'octets consécutifs réservés à cet effet. Et le meilleur moyen de faire cela est de déclarer un tableau, par exemple avec char buffer[256];.
Or, invoquer le nom de tableau seul (ici buffer) renvoie justement l'adresse en mémoire de ce tableau (et est donc ici une expression de type char *). Et c'est précisément parce cet identifiant est de type pointeur que tu peux l'indexer avec des crochets « [ ] » et accéder à ses éléments. Par conséquent, tu n'as pas besoin de demander explicitement l'adresse du tableau avec « & » puisque l'identifiant te le renvoie déjà.
À noter que, du coup, les expressions « buffer » et « &buffer » sont équivalentes si buffer est un tableau, et renvoient donc la même information. Ce serait différent si buffer était un pointeur déclaré comme tel et qui pointait un espace libre en mémoire : la première renverrait la valeur du pointeur, donc l'emplacement de l'espace libre, ce qui est ce que l'on cherche, alors que l'autre renverrait l'emplacement du pointeur lui-même, qui se ferait alors écraser par la lecture de la chaîne, lecture qui au passage écraserait aussi tout ce qui se trouve à côté.
Partager