J'ai une question de base sur la matrice et le pointeur en C / C ++.
dire que j'ai: p> Comment passer le Comment puis-je traiter avec le tableau de pointeur? P> Je ne comprends pas vraiment pourquoi : Foo * * à foo * [4]. Si comme paramètre de fonction, ils sont inter-changements entre eux, pourquoi pendant la mission, il me donne une erreur de compilation? P> J'ai essayé de dupliquer le message d'erreur avec le code minimum comme suit: P> FOOPTRARRAY code > dans une fonction?
J'ai essayé: p> #include <iostream>
using namespace std;
struct Foo
{
int id;
};
void getResult(Foo** fooPtrArray)
{
cout << "I am in getResult" << endl;
Foo* fooPtrArray1[4];
fooPtrArray1 = fooPtrArray;
}
int main()
{
Foo* fooPtrArray[4];
getResult(fooPtrArray);
}
5 Réponses :
Les deux et p> ainsi que p> va Travailler parfaitement bien (ils sont tous équivalents). P> Il n'est pas clair de votre question quel était le problème. Qu'est-ce qui a échoué "? P> Lorsque vous passez des matrices de passage comme celui-ci, il est généralement logique de passer également le nombre d'éléments, car l'astuce avec le type de tableau de caractères est normalement utilisée spécifiquement pour permettre des réseaux de passage de différentes tailles p> mais si vous allez toujours passer des tableaux d'éléments strictement 4, il pourrait être une meilleure idée d'utiliser un pointeur typé différemment en tant que paramètre P > int getResult(Foo* (&fooPtrArray)[4]);
...
Foo* array[4];
getResult(array);
Cela semble intéressant: int getresult (foo * (* facoprarray) [4]) code> avec deux astérisques et une paire de support. Est-ce exact?
Oui c'est correct. Mais en C ++, une référence (au lieu d'un pointeur) pourrait être plus appropriée dans ce cas (voir les commentaires adidtions dans la réponse).
Pourriez-vous élaborer comment FOO * (& FOOPTRARRAY) [4] CODE> est analysé et comment vous appelleriez-vous sur le corps de la fonction?
@splicer: FOOPTRARRAY code> Dans ce cas est une référence à un tableau i> de 4 pointeurs sur foo code>. Dans la fonction, il serait utilisé dans la voie "habituelle", comme facoptrarray [3] = 0 code>. Ce n'est pas différent du premier groupe de variantes, à l'exception du type de matrice est conservé (non décroissé à un pointeur), ce qui signifie que vous pouvez faire Tailleof FOOPTARARRAY / TAILLEOF * FOOPTRARRAY COOP> et obtenez 4 comme résultat. Encore une fois, ce paramètre n'est compatible que avec des arguments à 4 éléments.
Ces deux signatures de fonction ressemblent à elles devraient fonctionner. Lorsque vous appelez la fonction, vous feriez quelque chose comme ceci:
int returnValue; returnValue = getResult(fooPtrArray);
Qu'est-ce que vous avez déclaré avec la ligne suivante:
for (int i=0; i < arraySize; i++)
{
Foo* fooPtr = fooPtrArray[i];
if (fooPtr)
{
fooPtr->memberFunction();
fooPtr->memberVariable;
}
}
Je ne vois pas comment cela peut compiler sans INT renvoyé ?! P>
@kinopiko Votre code ne compile pas en C ++. P>
@lily Quel est le message d'erreur que vous obtenez? Dans votre exemple GetResult doit renvoyer un int. C'est probablement ce qui échoue. P>
Définir "Échec". Échec de la compilation? à l'exécution? Comment, exactement (ou vaguement, ça ne me dérange pas)?
Je joins mon code coupé comme ci-dessus, c'est une erreur de compilation. L'erreur vient de l'intérieur de la fonction Void getResult (FOO * * FOOPTRARAY)