web-dev-qa-db-fra.com

En utilisant un pointeur sur un tableau de caractères, les valeurs de ce tableau peuvent être consultées?

J'ai créé ptr en tant que pointeur sur un tableau de 5 caractères.

char (*ptr)[5];

lui a attribué l'adresse d'un tableau de caractères.

char arr[5] = {'a','b','c','d','e'};
ptr = &arr;

en utilisant le pointeur ptr puis-je accéder aux valeurs char de ce tableau?

printf("\nvalue:%c", *(ptr+0));

Il n'imprime pas la valeur. 

D'après ma compréhension, ptr contiendra l'adresse de base du tableau, mais il pointe en fait sur la mémoire requise pour le tableau complet (c'est-à-dire 5 caractères). Ainsi, lorsque ptr est incrémenté, il avance de sizeof(char)*5 octets. Donc, n'est-il pas possible d'accéder aux valeurs du tableau en utilisant ce pointeur sur tableau?

19
Pravi

Lorsque vous souhaitez accéder à un élément, vous devez d'abord déréférencer votre pointeur, puis indexer l'élément souhaité (ce qui permet également de déréférer). c'est-à-dire que vous devez faire:

printf("\nvalue:%c", (*ptr)[0]);, qui est identique à *((*ptr)+0)

Notez que travailler avec un pointeur sur des tableaux ne sont pas très courants en C. tableau, afin que l'on puisse savoir quand le tableau se termine, par exemple.

char arr[5] = {'a','b','c','d','e',0}; 
char *ptr = arr; //same as char *ptr = &arr[0]

printf("\nvalue:%c", ptr[0]);
18
nos

La plupart des personnes qui répondent ne semblent même pas savoir ce qu'est un pointeur de tableau ...

Le problème est que vous faites des arithmétiques de pointeur avec un pointeur de tableau: ptr + 1 signifie "saute 5 octets en avant puisque ptr pointe sur un tableau de 5 octets".

Faites comme ceci à la place:

#include <stdio.h>

int main()
{
  char (*ptr)[5];
  char arr[5] = {'a','b','c','d','e'};
  int i;

  ptr = &arr;
  for(i=0; i<5; i++)
  {
    printf("\nvalue: %c", (*ptr)[i]);
  }
}

Prenez le contenu de ce que le pointeur du tableau pointe vers et vous obtenez un tableau. Donc, ils fonctionnent comme n'importe quel pointeur en C.

6
Lundin

Vous devriez créer ptr comme suit:

char *ptr;

Vous avez créé ptr en tant que tableau de pointeurs sur les caractères. Ce qui précède crée un seul pointeur sur un caractère.

Edit: le code complet devrait être:

char *ptr;
char arr[5] = {'a','b','c','d','e'};
ptr = arr;
printf("\nvalue:%c", *(ptr+0));
0
qbert220

Utilisation d'un pointeur avant un tableau de caractères

Normalement, un tableau de caractères est utilisé pour stocker des éléments individuels dans ce fichier, c’est-à-dire 1 octet chaque.

par exemple:

char a[]={'a','b','c'};

nous ne pouvons pas y stocker plusieurs valeurs.

en utilisant un pointeur avant le tableau de caractères, nous pouvons stocker les éléments de tableau multi-dimensionnels dans le tableau

c'est à dire.

char *a[]={"one","two","three"};
printf("%s\n%s\n%s",a[0],a[1],a[2]);
0
Hemaraj Jupudi