en programmation C lorsque nous imprimons une chaîne. Nous n'utilisons pas *. Mais lors de l'impression d'un numéro à l'aide de PrintF, nous utilisons *. Alors, comment c'est la compréhension, j'imprime une chaîne ou int. Comprend en utilisant% s opérateur?
Fixation d'un exemple de code p>
6 Réponses :
dans Si vous souhaitez imprimer toute la chaîne, vous devez donner son adresse, aucun si vous voulez Imprimez son premier caractère que vous faites `printf ("% c ", * pointererstringdata); p> in p> vous ne voulez pas imprimer l'adresse mémorisée dans Il n'y a pas de différence avec une chaîne ... Sauf que vous voulez écrire tout le String P> Un pointeur est un pointeur, quel que soit son pointeur d'un pointeur ou d'un pointeur à un int p> p> * code> p>
pointerindata code> mais la valeur identique à cette adresse, vous devez donc avoir à DÉRÉFERENCEFE P>
Merci beaucoup. J'ai compris.
Lorsque nous imprimons une chaîne. Nous n'utilisons pas *. Mais lors de l'impression d'un numéro à l'aide de printf, nous utilisons * p> blockQuote>
Parce que le spécificateur de conversion
d code> espère un
int code>, alors que le spécificateur de conversion
s code> s'attend à un pointeur em> (à un
char code> et avec ceci au 1er élément d'un
0 code> - atténué
char code> graphique, ce qui est en fait ce que c utilise avec Mimik ce qui est couramment appelé une "chaîne"). p>
Le spécificateur de format Si vous passez % s code> s'attend à un pointeur. P>
* pointerstringdata code> La fonction recevra le premier caractère de la matrice, que la fonction essaiera de la déséroférence et provoquera probablement un crash. P>
Parce que les pointeurs portent référence à l'objet. * code> Déréférence Cet objet. Donc, si le pointeur détient la référence à l'objet Char lorsque nous avons la déré à la déréence, nous obtenons cet objet. Donc, le pointeur de charence de déséroférence est juste le même caractère, pas l'adresse du premier caractère dans la chaîne. P>
Le langage C n'a aucune disposition pour traiter une chaîne comme valeur. Vous ne pouvez pas transmettre une chaîne pour fonctionner. Le pointeur Pour imprimer des chaînes, lorsque En revanche, c Supporte le traitement des nombres en tant que valeurs, de sorte qu'elles peuvent être transmises directement aux fonctions. P> pointerstringdata code> est juste un pointeur sur un
char code>, donc
* pointerstringdata code> est un
char code>, pas une chaîne. Passage
* pointerstringdata code> ne passera qu'un seul caractère, pas une chaîne. P>
% s code> est utilisé,
printf code> attend que l'argument soit un pointeur. Il utilise ce pointeur à lire de la mémoire et lit et imprime des caractères jusqu'à ce qu'il trouve des caractères nuls. P>
Bonne réponse, vous avez un peu écrit une courte version de ma réponse en même temps que j'ai écrit la mienne, vous l'avez bouillie aux points importants, j'ai tendance à expliquer beaucoup. +1
Disclaimer: Il s'agit d'une explication sur la manière dont il apparaît au développeur, ce n'est pas la manière dont il est après la compilation du code (en particulier parce que l'optimiseur pourrait tout changer). P>
C est une langue de niveau très basse. Vous devez comprendre qu'une variable contient toujours une valeur de quelques octets. P>
C est également l'une des langues qui a rendu très pratique d'accéder à de grandes structures. P>
Le contenu de la variable peut être: p>
Il n'y a pas de concept réel d'avoir une variable de longueur dynamique en tant que valeur, des chaînes ainsi que des matrices de longueur dynamique n'ont l'adresse de la variable. P>
Comme les piqûres sont une longueur variable, la convention en C est: p>
C'est ce qu'on appelle un chaîne null terminée . P>
De cette façon, vous pouvez transmettre des données de la longueur variable à imprimerf et PrintF trouvera la longueur en recherchant le premier octet 0. P>
Conversion de variables contenant l'adresse à ceux contenant une valeur fonctionne comme ceci: "var_with_address" s'appelle un pointeur. P>
en conclusion: strong> Vous devez passer des chaînes comme adresse de valeur et non à la valeur, pas comme adresse, et c'est la différence pourquoi vous devez utiliser
var_with_value = * var_with_address code>
var_with_address = & var_with_value code> p>
* code> p>
Pourquoi il est voté?
Vous pouvez soit
printf ("% d", numéroData) code> ou que vous pouvez
printf ("% d", * pointerIndata) code>. Le premier transmet les données directement à partir de la variable, la seconde transmet les mêmes données mais accessible via le pointeur. Toutefois, le spécificateur de format code>% S code> s'attend à un pointeur, pas une valeur, donc vous passez
pointerstringdata code> qui est un pointeur.
@weather Vane merci d'avoir répondu. Ma question était entre deux types de données. Pour le numéro, je comprends la différence entre NumberData * PointerIndata. Pour l'impression numéroter, nous utilisons * pointerIndata. Pourquoi pas pour la chaîne? C'est pourquoi la question.
Vous devez rechercher des spécificateurs de format pour Printf. % S s'attend à un pointeur,% d s'attend à une valeur (entière).
@Vipin Il n'y a pas de type de données "String" dans C. Vous voudrez peut-être lire sur la manière dont les matrices C CODE> CHAR CODE> sont utilisées sur MIMIK "Strings" en particulier et comment les tableaux se rapportent / diffèrent des pointeurs en général .