Ne peut pas lancer de tableau de pointeur
J'ai de la source suivante:
#include <iostream>
using namespace std;
void main(int j)
{
char arr[10][10];
char** ptr;
ptr = arr;
}
quand je le compiler à l'aide de VS2010, j'obtiens cette erreur:
error : a value of type "char (*)[10]" cannot be assigned to an entity of type "char **"
Je pensais que les tableaux en c++ sont juste des pointeurs. Ainsi, un char[][]
pourrait également être char**
. Ce que je fais mal?
- Le C FAQ couvre ceci: c-faq.com/aryptr/pass2dary.html
- "Je pensais que les tableaux en c++ sont juste des pointeurs" - si vous pouviez me faire une faveur: trouver la personne qui vous a dit que, appeler un muppet, et point à cette question. Si vous l'avez lu dans un livre, le ramener à un remboursement. Si c'était un livre de la bibliothèque, mettre un morceau de papier dans la page avec les Url et une note que l'auteur est un muppet.
- double possible de la conversion de la 2D tableau de pointeur de pointeur
Vous devez vous connecter pour publier un commentaire.
Les types
char[10][10]
etchar**
etchar (*)[10]
sont différents types. Toutefois, le premier ne peut pas convertir dans le second, il peut convertir dans la troisième.Donc, essayez ceci:
Cela va fonctionner, parce que, comme je l'ai dit, l'objet de type
char[10][10]
pouvez convertir en un objet de typechar (*)[10]
. Ils sont des types compatibles.char(*ptr)[10]
un pointeur vers un 1d char tableau? Si oui, n'est-ce pas un 1d char matrice de même que 'char*'? Si cela est vrai, alors j'ai un pointeur vers un pointeur vers un char ->char**
.char*
.1D
tableau peut convertir enchar*
. Mais enchaînés de conversion n'est pas autorisé en C++. Il y a seulement une conversion dechar[10][10]
àchar (*)[10]
. Et pas davantage de conversion. SiA
peut convertir enB
, etB
peut convertir enC
. ensuite, vous ne pouvez pas écrireC=A
qui est ajouté à la chaîne de conversion, qui n'est pas autorisé.Tableaux ne sont pas des pointeurs.
Un tableau se désintègre à un pointeur dans la plupart des cas, mais ce n'est pas récursive. Ainsi, un
T[]
se désintègre à unT *
, mais unT[][]
n'a pas de carie à uneT**
.Je suggère la lecture de l'ensemble de la FAQ C le chapitre sur les tableaux et les pointeurs; en particulier, la section sur les 2D les tableaux et les pointeurs de pointeurs.
La les réponses existantes, bien que correcte, n'est pas, il est très clair qu'il y a une raison fondamentale (en dehors des règles de la langue) pourquoi vous ne pouvez pas convertir
char [10][10]
àchar **
. Même si vous forcez la fonte en disant quelque chose commeil ne fait pas travailler.
La raison en est que le C et le C++ un tableau à deux dimensions est fixé dans la mémoire comme un tableau de tableaux. C'est, en C, un tableau à deux dimensions est fixé dans la mémoire comme une allocation unique,
Vous remarquerez que
arr
ne pointe pas vers unchar *
mais àarr[0][0]
qui est unchar
; par conséquent, tandis quearr
peut être converti en unchar *
, il ne peut pas être lancé à unchar **
.Le bon forcé cast serait
Si vous ne voulez pas la force de l'incantation (toujours une bonne idée si c'est possible!) vous dirais
ou pour rendre le résultat plus clair,
Et vous avez maintenant (en effet) un pointeur vers un tableau de 4 caractères. [Condition: je ne peux pas trouver quelque chose dans la norme qui interdit à une mise en œuvre à partir de l'ajout de l'espacement entre deux lignes d'un tableau, mais je ne crois pas que tout monde réel le faire, et de codification commune dépendent de l'hypothèse qu'il n'y aura pas de tel rembourrage.]
Si vous avez vraiment besoin de convertir
arr
à unchar **
vous devez créer explicitement un tableau de pointeurs:Le langage C ne peut, en principe le faire automatiquement pour vous si vous avez essayé de jeter un tableau à deux dimensions à un pointeur de pointeur, mais qui contreviendrait à la programmeur s'attend à ce que d'un plâtre n'a pas d'effets secondaires tels que l'allocation de mémoire.
En Java, par voie de comparaison, un tableau à deux dimensions est toujours un tableau de pointeurs de tableaux, de sorte que le tableau
est aménagé dans la mémoire de trois allocations, dans un ordre arbitraire et pas nécessairement adjacents,
Vous remarquerez immédiatement que cela nécessite plus de mémoire que l'équivalent C tableau, et est plus lent à évaluer au moment de l'exécution. D'autre part, il ne permet pas de lignes d'un tableau de sont de différentes longueurs.
Non, un tableau est un ensemble d'objets disposés de manière contiguë en mémoire. Dans certaines circonstances, elles sont convertibles à un pointeur sur le premier élément.
Pas. Il est convertible en un pointeur vers le premier tableau à une dimension (qui est le type
char (*)[10]
mentionné dans le message d'erreur); mais ce tableau n'est pas un pointeur, donc il n'est pas convertible en un pointeur de pointeur.Tableaux ne sont PAS juste des pointeurs -- tableaux sont des tableaux. Les tableaux ne sont pas des types de classe, cependant, de sorte que vous ne pouvez pas les utiliser dans de nombreux endroits. La chose qui cause de la confusion, c'est que la matrice de noms PEUT être implicitement converti en pointeurs vers le tableau du premier élément, ce qui signifie que vous pouvez utiliser un tableau dans de nombreux endroits où vous avez besoin d'un pointeur et il fonctionne. Ceci, cependant, n'est pas un de ces endroits.
Tableaux ne sont pas des pointeurs (je remarque que beaucoup de livres ont tendance à vous faire réfléchir à ce, tout de même). Ils sont quelque chose de complètement différent. Un pointeur est une adresse en mémoire tandis qu'un tableau est un ensemble contigu de certaines données.
Dans certains cas, un tableau peut se désintègrent en un pointeur sur son premier élément. Vous pouvez ensuite utiliser l'arithmétique des pointeurs pour parcourir la mémoire contiguë. Un exemple de ceci serait le cas lors du passage d'un tableau à une fonction comme paramètre.
Ce que vous voulez probablement faire ici, c'est quelque chose comme:
Évidemment, vous aurez besoin d'utiliser des tableaux 2D et char** dans votre cas. Je vais laisser ça à vous 🙂
L'erreur exactement vous dit quoi de mal une double dimension tableau peuvent être attribués à un pointeur de tableau pas un double pointeur. Donc, ce que vous avez besoin est:
Tout d'abord
Tableaux ne sont pas des pointeurs!! mais ils agissent parfois comme des pointeurs.
La règle est la suivante:
Une expression de type tableau (qui peut être un nom de tableau) convertit un pointeur à tout moment un type tableau n'est pas juridique, mais un type de pointeur est.
Donc si vous avez une seule dimension tableau:
Puis
arr
se désintègre à l'adresse de l'élément zéro, il a le typechar *
.Donc:
Mais si vous avez un 2 dimensions, tableau qui est essentiellement un tableau de tableaux.
Puis
arr
se désintègre à l'pointeur sur un tableau de 10 caractères.Donc, afin d'assigner
arr
à quelque chose, il faut que quelque chose en fonction du type, qui est pointeur vers un tableau de caractères.Donc:
Lorsque vous lancez ar[10][10] de pointeur, vous obtiendrez un tableau de pointeur comme dit ci-dessus *ar[10] et non **ar.