-3
votes

Lorsque vous imprimez une chaîne, nous n'utilisons pas *. Pourquoi?

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 xxx


5 commentaires

Pourquoi il est voté?


Vous pouvez soit printf ("% d", numéroData) ou que vous pouvez printf ("% d", * pointerIndata) . 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 % S s'attend à un pointeur, pas une valeur, donc vous passez pointerstringdata 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 CHAR sont utilisées sur MIMIK "Strings" en particulier et comment les tableaux se rapportent / diffèrent des pointeurs en général .


6 Réponses :


1
votes

dans xxx

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);


in xxx

vous ne voulez pas imprimer l'adresse mémorisée dans pointerindata mais la valeur identique à cette adresse, vous devez donc avoir à DÉRÉFERENCEFE

Il n'y a pas de différence avec une chaîne ... Sauf que vous voulez écrire tout le String

Un pointeur est un pointeur, quel que soit son pointeur d'un pointeur ou d'un pointeur à un int


1 commentaires

Merci beaucoup. J'ai compris.



3
votes

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 *

Parce que le spécificateur de conversion d espère un int , alors que le spécificateur de conversion s s'attend à un pointeur (à un char et avec ceci au 1er élément d'un 0 - atténué char graphique, ce qui est en fait ce que c utilise avec Mimik ce qui est couramment appelé une "chaîne").


0 commentaires

1
votes

Le spécificateur de format % s s'attend à un pointeur.

Si vous passez * pointerstringdata 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.


0 commentaires

0
votes

Parce que les pointeurs portent référence à l'objet. * 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.


0 commentaires

2
votes

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 pointerstringdata est juste un pointeur sur un char , donc * pointerstringdata est un char , pas une chaîne. Passage * pointerstringdata ne passera qu'un seul caractère, pas une chaîne.

Pour imprimer des chaînes, lorsque % s est utilisé, printf 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.

En revanche, c Supporte le traitement des nombres en tant que valeurs, de sorte qu'elles peuvent être transmises directement aux fonctions.


1 commentaires

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



1
votes

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).


C est une langue de niveau très basse. Vous devez comprendre qu'une variable contient toujours une valeur de quelques octets.

C est également l'une des langues qui a rendu très pratique d'accéder à de grandes structures.

Le contenu de la variable peut être:

  • une valeur (E.g: comme vous avez mentionné un numéro)
  • une adresse dans la RAM
  • une structure qui utilise plus de RAM consécutive (et c rend agréable de l'utiliser comme si c'était plus que cela)
    • State (longueur fixe)
    • Tableau avec longueur fixe

      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.

      Comme les piqûres sont une longueur variable, la convention en C est:

      • avoir une adresse dans la variable
      • Lisez l'octet de données réel par octet à partir de cette adresse
      • lire les données jusqu'à ce que l'octet soit 0 (NULL)

        C'est ce qu'on appelle un chaîne null terminée .

        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.

        Conversion de variables contenant l'adresse à ceux contenant une valeur fonctionne comme ceci:
        var_with_value = * var_with_address
        var_with_address = & var_with_value

        "var_with_address" s'appelle un pointeur.

        en conclusion: 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 *


0 commentaires