11
votes

Quelle est la différence entre Char * s [] et caractère (* s) []?

Quand j'ai lu des livres sur le langage C, le pointeur de deux niveaux m'a dérangé beaucoup. XXX

Quelle est donc quelle est la différence entre eux?


2 commentaires

CDECL.org ou Installez le programme CDECL .


Le deuxième exemple est plus clairement écrit comme char * s [5]; .


4 Réponses :


8
votes
  • premier est une matrice 2 dimensions de char
  • second est un tableau de pointeur sur char
  • tiers est le pointeur sur un tableau de char

2 commentaires

Il convient également de mentionner qu'un tableau à 2 dimensions est simplement un tableau de matrices.


Ou un tableau de 5, 5 matrices de caractères



17
votes

en C, il vaut mieux parler de la déclaration. Ensuite, cela devient intuitif. Pour cela, vous suivez la convention à droite gauche. Voici comment ça se passe: xxx pré>

Comment allez-vous parler em> it? Pour cela, vous commencez à droite du nom de la variable s code> puis allez à gauche. Donc, vous commencez par dire "s est un / an", à droite, vous voyez un [] code> et vous dites "s est un tableau ...". Et puis vous allez à gauche et voyez le * code> et dites "s est un tableau de pointeurs". Et c'est ce que c'est. Il est un tableau de 5 pointeurs. Vous pouvez stocker différents pointeurs dans ce tableau. P>

Maintenant pour l'autre: P>

int (*callme)(int a, int b)
int (*callme[10])(int a, int b)


11 commentaires

Vous avez oublié d'inclure char ; char * s [5] n'est pas un tableau de 5 "points différents" de tout type, il est spécifiquement un tableau de 5 pointeurs à char .


C'est vrai. J'aurais dû mentionner ça.


Je ne pense pas qu'il est complètement correct de dire () a une plus grande priorité. Peut-être que vous vouliez dire que la présence de parenthèses peut altérer la liant de déclarants compliqués.


Il convient de souligner que ni a ou b sont nécessaires aux déclarations. (int, int) est suffisant.


La liaison est définitivement meilleure ici. Mon anglais n'est pas le meilleur. Merci!


Je reprend cela. Comment sont (complexes) déclarations analysées en termes de La priorité et l'associativité? suggère que la priorité s'applique ici.


La priorité et l'associativité sont définitivement sur la manière dont nous examinons les règles, mais le résultat est toujours la manière dont la liaison a lieu. Je fais beaucoup comme le mot.


Pouvez-vous m'en dire plus sur les tables de recherche des fonctions? int (* Callme [10]) (int A, int b) Comment utiliser cela?


Vous pouvez rechercher ce que la table vectorielle interruption est. Vous pouvez simuler cela pour vos besoins de traitement des erreurs. Vous pouvez également utiliser que si vous programmez une machine à états (un robot, la tortue dans les graphiques de la tortue, une simulation d'un processeur simple) qui dispose d'une liste de commandes primitives simples, que vous pouvez stocker dans un tableau, puis utilisez un Tableau de nombres pour faire des commandes complexes.


Dans beaucoup d'interface graphique de l'interface graphique (dans les jours les plus anciens), différents événements d'interface graphique fourniraient des chiffres différents et vous devez correspondre à des chiffres aux fonctions. C'est également un endroit où vous pourrez utiliser cette fonction.


Donc, en résumé, tout lieu où vous utiliseriez beaucoup de conditions de sélection dans une liste de fonctions de largish, vous pouvez utiliser un tableau de pointeurs vers des fonctions. Il est un peu difficile de donner des exemples en commentaires, mais je suis sûr que vous pouvez rechercher des exemples pour des tableaux de pointeurs vers des fonctions dans Google.



3
votes

tandis que Déclaration était couvert, peut-être des différences entre l'utilisation doivent également être signalées: < / p>

CHAR S [5] [5]; -

  • s pointe vers une zone de mémoire allouée (tas de tas de global, pile si local),
  • Vous pouvez écrire en toute sécurité jusqu'à 25 valeurs de caractère à s [0] [0] .. s [4] [4] (ou à s [0] .. s [24] ),
  • Tailleof (s) == 25.

    char * s [5]; -

    • s pointe vers une zone de mémoire allouée (tas de tas de global, pile si local),
    • Vous pouvez écrire en toute sécurité à 5 valeurs de pointeur à s [0] .. s [4] ,
    • Tailleof (s) == 40 (*).

      char (* s) [5]; -

      • s fait pas point à une mémoire allouée - c'est simplement un pointeur non initialisé à ce stade,
      • Vous pouvez écrire en toute sécurité une valeur de pointeur à & s ,
      • Tailleof (s) == 8 (*).

        (*) Remarque: En supposant une architecture de 64 bits.


0 commentaires

3
votes

1.Char S [5] [5];
Ici, S est une matrice bidimensionnelle avec 5 rangées et 5 colonnes. Où dans ces 5 lignes et 5 colonnes, vous économiserez un élément de caractère de type.

2.Char * s [5]; S est un tableau unidimensionnel avec 5 éléments que chaque élément est de type pointeur de type sur le caractère.

3.Char (* s) [5]; s est un pointeur ici pas un tableau. S pointe sur une gamme de caractères. Pour par exemple,

Char Arr [5] [5]; Char (* s) [5]; S = arr;

s [0] [0] sera identique à la matrice d'arr [0] [0]


3 commentaires

Est char (* s) [5] juste un pointeur? Y a-t-il une différence entre char * s , char (* s) [5] et char (* s) [10] ?


@Storen Oui Char (* s) [5] est juste un pointeur. Mais c'est un pointeur à un tableau de char. Pour par exemple: 1. Char (* s) [5]; Char Arr [2] [5]; S = ARR; dans celui-ci est pointé vers un tableau de 5 éléments qui est la première ligne d'arr. Si vous faites s ++, s pointe sur la deuxième ligne d'arr. 2. 'Char * s; Char Arr [5]; S = arr; Ici, s pointe sur le premier élément du tableau qui est le caractère. Si vous faites S ++, il pointe du caractère suivant`


Mais je veux savoir comment le compilateur connaît ce type de pointeur est INT, l'autre est CHARP? Lorsque nous définissons un type int * a , le compilateur stocke-t-il non seulement la valeur A , mais stocke également le type de A , donc Cela peut avoir une dépense de mémoire supplémentaire?