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.
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 longueurSIZE
- Un pointeur
char *a;
indique que la valeur à l'emplacement de l'a
est un pointeur vers unchar
. 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];
deviendrachar *a = malloc(10 * sizeof(char));
, suivie d'une vérification quea != NULL
. Notez que vous n'avez pas besoin de diresizeof(char)
dans ce cas, parce quesizeof(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 utiliserstrlen()
, 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 avecmalloc()
. Si votre pointeura
, il suffit d'écrirefree(a);
à un point dans le code où vous savez que vous n'avez plus besoin de quoi quea
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
".
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.
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.
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.