web-dev-qa-db-fra.com

Pointeur sur une chaîne en C?

char *ptrChar;

Je sais que ptrChar est un pointeur vers char. Quelle est la commande pour un pointeur sur chaîne?

Edit: Si c'est la même chose (ptr en char vs ptr en chaîne) - que représente la définition de variable ci-dessous?

char (*ptr)[N];

Je suis confus.

9
user1980750

La même notation est utilisée pour pointer sur un seul caractère ou le premier caractère d'une chaîne terminée par un caractère nul:

char c = 'Z';
char a[] = "Hello world";

char *ptr1 = &c;
char *ptr2 = a;      // Points to the 'H' of "Hello world"
char *ptr3 = &a[0];  // Also points to the 'H' of "Hello world"
char *ptr4 = &a[6];  // Points to the 'w' of "world"
char *ptr5 = a + 6;  // Also points to the 'w' of "world"

Les valeurs dans ptr2 Et ptr3 Sont les mêmes; les valeurs de ptr4 et ptr5 le sont également. Si vous souhaitez traiter certaines données comme une chaîne, il est important de vous assurer qu'elles sont terminées par null et que vous savez combien d'espace vous avez à utiliser. De nombreux problèmes sont dus au fait de ne pas comprendre l'espace disponible et de ne pas savoir si la chaîne a été correctement terminée par null.

Notez que tous les pointeurs ci-dessus peuvent être déréférencés comme s'ils étaient un tableau:

 *ptr1    == 'Z'
  ptr1[0] == 'Z'

 *ptr2    == 'H'
  ptr2[0] == 'H'
  ptr2[4] == 'o'

 *ptr4    == 'w'
  ptr4[0] == 'w'
  ptr4[4] == 'd'

  ptr5[0] ==   ptr3[6]
*(ptr5+0) == *(ptr3+6)

Ajout tardif à la question

Que représente char (*ptr)[N];?

C'est une bestiole plus complexe. Il s'agit d'un pointeur vers un tableau de caractères N. Le type est assez différent; la façon dont il est utilisé est très différente; la taille de l'objet pointé est assez différente.

char (*ptr)[12] = &a;

(*ptr)[0] == 'H'
(*ptr)[6] == 'w'

*(*ptr + 6) == 'w'

Notez que ptr + 1 Pointe vers un territoire indéfini, mais pointe "un tableau de 12 octets" au-delà du début de a. Dans un scénario légèrement différent:

char b[3][12] = { "Hello world", "Farewell", "Au revoir" };

char (*pb)[12] = &b[0];

Maintenant:

(*(pb+0))[0] == 'H'
(*(pb+1))[0] == 'F'
(*(pb+2))[5] == 'v'

Vous ne rencontrerez probablement pas de pointeurs vers des tableaux, sauf par accident pendant un certain temps; Je les ai utilisés plusieurs fois au cours des 25 dernières années, mais si peu que je peux compter les occasions sur les doigts d'une main (et plusieurs d'entre eux ont répondu à des questions sur Stack Overflow). Au-delà de savoir qu'ils existent, qu'ils sont le résultat de la prise de l'adresse d'un tableau, et que vous ne le vouliez probablement pas, vous n'avez pas vraiment besoin d'en savoir plus sur les pointeurs vers les tableaux.

21
Jonathan Leffler

Exactement pareil. Une chaîne C n'est rien d'autre qu'un tableau de caractères, donc un pointeur vers une chaîne est un pointeur vers un tableau de caractères. Et un pointeur sur un tableau est identique à un pointeur sur son premier élément.

9
Thomas

Une chaîne C n'est rien d'autre qu'un tableau de caractères, donc un pointeur vers une chaîne est un pointeur vers un tableau de caractères. Et un pointeur sur un tableau est identique à un pointeur sur son premier élément. La chaîne est essentiellement délimitée de l'endroit où elle est pointée vers (char * ptrChar;), jusqu'au caractère nul (\ 0).

1
Sachin Sridhar

La chaîne est essentiellement délimitée à partir de l'endroit où elle est pointée (char *ptrChar;), au caractère nul (\0).

Le char *ptrChar; pointe en fait vers le début de la chaîne (tableau char), et c'est donc le pointeur sur cette chaîne, donc quand vous aimez ptrChar[x] par exemple, vous accédez réellement à l'emplacement de la mémoire x fois après le début du caractère (alias d'où pointe ptrChar).

1
SmRndGuy