Est-il possible de convertir char[] en char* en C?

je fais une tâche où nous devons lire une série de chaînes à partir d'un fichier dans un tableau. Je dois appeler un algorithme de chiffrement sur le tableau (le chiffrement transpose les tableaux 2D). Donc, au début, j'ai mis toutes les informations du fichier dans un tableau 2D, mais j'ai eu beaucoup de problèmes avec les types conflictuels dans le reste de mon code (en essayant spécifiquement de mettre char[] à char*). Donc, j'ai décidé de passer à un tableau de pointeurs, ce qui a rendu tout beaucoup plus facile dans la plupart de mon code.

Mais maintenant J'ai besoin de convertir char* en char[] et de revenir en arrière, mais je ne peux pas le comprendre. Je n'ai pas été en mesure de trouver quelque chose sur google. Je commence à me demander si c'est possible.

44
demandé sur tparf 2012-03-09 06:01:54

4 réponses

on dirait que vous êtes confus entre les pointeurs et les tableaux. Pointeurs et tableaux (dans ce cas char * et char [])ce n'est pas la même chose.

  • Un tableau char a[SIZE] indique que la valeur à l'emplacement de l' a est un tableau de longueur SIZE
  • Un pointeur char *a; indique que la valeur à l'emplacement de l' a est un pointeur vers un char. Ceci peut être combiné avec l'arithmétique des pointeurs à se comporter comme un tableau (par exemple, a[10] 10 entrées passé où a points)

En mémoire, il ressemble à ceci (exemple tiré d' la FAQ):

 char a[] = "hello";  // array

   +---+---+---+---+---+---+
a: | h | e | l | l | o | |
   +---+---+---+---+---+---+

 char *p = "world"; // pointer

   +-----+     +---+---+---+---+---+---+
p: |  *======> | w | o | r | l | d | |
   +-----+     +---+---+---+---+---+---+

il est facile d'être confus sur la différence entre les pointeurs et les tableaux, parce que dans de nombreux cas, une référence de tableau "se décompose" à un pointeur sur son premier élément. Cela signifie que dans de nombreux cas (comme quand passé à un appel de fonction) les tableaux deviennent des pointeurs. Si vous souhaitez en savoir plus, cette section de la FAQ C décrit les différences en détail.

une différence pratique majeure est que le compilateur sait combien de temps dure un tableau. En utilisant les exemples ci-dessus:

char a[] = "hello";  
char *p =  "world";  

sizeof(a); // 6 - one byte for each character in the string,
           // one for the '' terminator
sizeof(p); // whatever the size of the pointer is
           // probably 4 or 8 on most machines (depending on whether it's a 
           // 32 or 64 bit machine)

sans voir votre code, il est difficile de recommander le meilleur plan d'action, mais je pense que changer pour utiliser des pointeurs partout résoudra les problèmes que vous avez actuellement. Prendre note que maintenant:

  • vous aurez besoin d'initialiser la mémoire où que soient les tableaux. Par exemple, char a[10]; deviendra char *a = malloc(10 * sizeof(char));, suivie d'une vérification que a != NULL. Notez que vous n'avez pas besoin de dire sizeof(char) dans ce cas, parce que sizeof(char) est défini comme étant 1. Je l'ai laissé à l'exhaustivité.

  • n'importe où vous avez déjà eu sizeof(a) for array length devra être remplacé par la longueur de la mémoire que vous avez attribuée (si vous utilisez des chaînes, vous pouvez utiliser strlen(), qui compte jusqu'à l' '').

  • Vous besoin d'un faire un appel correspondant à free() pour chaque appel à malloc(). Cela indique à l'ordinateur que vous avez terminé en utilisant la mémoire que vous avez demandée avec malloc(). Si votre pointeur a, il suffit d'écrire free(a); à un point dans le code où vous savez que vous n'avez plus besoin de quoi que a points.

Comme une autre réponse a souligné, si vous voulez obtenir l'adresse de début d'un tableau, vous pouvez utiliser:

char* p = &a[0] 

Vous pouvez lire ce que "pointeur de char p devient l'adresse de l'élément [0]a".

94
répondu Timothy Jones 2015-06-26 01:10:20

Si vous avez char[] c ensuite, vous pouvez faire char* d = &c[0] et accéder à l'élément c[1] en faisant *(d+1), etc.

10
répondu dave 2012-03-09 02:08:21

vous n'avez pas besoin de les déclarer comme tableaux si vous voulez les utiliser comme pointeurs. Vous pouvez simplement référencer des pointeurs comme s'ils étaient des tableaux multidimensionnels. Il suffit de créer comme un pointeur vers un pointeur et d'utiliser malloc:

int i;
int M=30, N=25;
int ** buf;
buf = (int**) malloc(M * sizeof(int*));
for(i=0;i<M;i++)
    buf[i] = (int*) malloc(N * sizeof(int));

et puis, vous pouvez référencer buf[3][5] ou quoi que ce soit.

2
répondu Arcinde 2012-03-09 02:17:25

Eh bien, je ne suis pas sûr de comprendre votre question...

En C, Char[] et Char* sont la même chose.

Edit : merci pour ce lien intéressant.

-4
répondu TheHappyMarvin 2012-03-09 02:16:09