Pourquoi scanf n’a-t-il pas besoin d’une esperluette pour les chaînes et fonctionne-t-il également correctement dans printf (en C)?

J’apprends des chaînes en C maintenant.

Comment faire pour utiliser scanf pour obtenir une chaîne que vous pouvez faire

scanf("%s",str1); 

et pour printf tu peux faire

 printf("The ssortingng is %s\n", str1); 

Je comprends que pour scanf, c’est parce que la chaîne est juste un tableau de caractères qui est un pointeur, mais pour printf, comment se fait-il que vous puissiez simplement mettre le nom de variable comme vous le feriez pour un int ou float?

scanf besoin de l’adresse de la variable dans laquelle lire, et les tampons de chaîne sont déjà représentés en tant qu’adresses (pointeur sur un emplacement en mémoire ou tableau qui se décompose en un pointeur).

printf fait de même, en traitant %s comme un pointeur sur une chaîne.

En C, les variables qui sont des tableaux deviennent un pointeur sur le premier élément du tableau lorsqu’elles sont utilisées comme arguments de fonction – ainsi votre scanf () voit un pointeur sur la mémoire (en supposant que “str1” est un tableau).

Dans votre printf (), “str1” pourrait être un pointeur sur une chaîne ou un tableau de caractères (auquel cas l’argument vu par printf () serait un pointeur sur le premier élément du tableau).