Le passage d'un tableau de structures par référence en C++
Donc je suis encore assez nouveau à la programmation/C++, et toujours essayer d'envelopper ma tête autour de pointeurs et passage par référence et tout et tout. Un programme que j'essaie de comprendre maintenant besoin de passer un tableau de structures à une autre fonction. J'ai obtenu ce travail en juste en passant le tableau directement là-bas. Il semble bien fonctionner. Cependant, ce qui m'inquiète c'est que je crois que je suis de passage par valeur, et je comprends que c'est mieux de passer par les structures de référence, de sorte que vous n'êtes pas de faire une copie de la structure à chaque fois...
De toute façon, voici un exemple de base de ce que je fais:
struct GoldenHelmet {
int foo;
string bar;
};
void pass (GoldenHelmet ofMambrino[], int size);
int main () {
GoldenHelmet ofMambrino[10];
int size = sizeof(ofMambrino) / sizeof(ofMambrino[0]);
ofMambrino[1].foo = 1;
pass(ofMambrino, size);
cout << ofMambrino[2].foo << endl;
return 0;
}
void pass (GoldenHelmet ofMambrino[], int size) {
ofMambrino[2].foo = 100;
ofMambrino[2].bar = "Blargh";
}
De ce que je comprends, il fonctionne parce que les tableaux sont déjà pointeurs, non? Mais la façon dont je l'ai configuré, suis-je encore passer une copie de la structure et de tout le pass() la fonction? J'ai essayé de le passer par référence, mais il ne semble pas vouloir travailler toute façon j'ai essayé.
- Les tableaux ne sont pas des pointeurs. Répétez cette opération pour vous jusqu'à ce que vous évanouir, puis revenir à ce site et de lire les réponses qui ont été affichés par puis.
- Non, la réponse sera en C++ 🙂
- SB Merci pour la clarification. J'ai lu ce post et il semble impliquer que les tableaux sont des pointeurs. Je suppose que j'ai besoin de garder à la recherche en elle. De toute façon, va lire les réponses maintenant, merci pour l'aide tout le monde.
- Au lieu de lire, vous devez avoir lu l'article qui a prouvé hors de tout doute que vous devez m'envoyer tout de votre argent... de toute façon, ne croyez pas tout ce que vous entendez sur l'internet. En cas de doute, prendre un bon livre, ou par chèque dans la langue standard (gratuit à partir de GitHub) une fois que vous êtes à l'aise avec la langue.
- Ce Kerrek essaie de dire, c'est que c'est un malentendu commun, et il y a beaucoup de malentendus fréquents lorsqu'il s'agit de l'apprentissage du C++. Mais le choix d'un des livres sur cette liste qui ont été approuvés et recommandés par des experts, vous ne pouvez pas vous tromper.
- Je suis en train de faire un C++ cours, et avoir une vie décente livre sur elle ainsi. J'ai récemment commencé sur les pointeurs, donc je n'avais aucune raison de penser autrement. De toute façon, bon point, et je vais continuer à essayer d'en apprendre plus.
- Avis personnel: Si vous êtes juste de commencer à apprendre le C++, vous ne devriez pas avoir des affaires avec des pointeurs à tous. Ceux-ci devraient être laissés pour beaucoup plus tard, lorsque vous implémentez votre propre gestion de la mémoire non formatée I/O, ou dans une discussion historique de bizarreries.
Vous devez vous connecter pour publier un commentaire.
Cette syntaxe:
est en fait assez déroutant. Parce que vous n'êtes pas le passage d'un tableau, vous passez un pointeur. Ils ne sont pas la même chose bien que, ne pas se confondre. Cette bizarrerie s'applique uniquement aux paramètres de la fonction. Le dessus est exactement identique à ceci:
Il est en fait impossible de passer un tableau de valeur, sauf si c'est un sous-objet d'un autre objet. Vous pouvez les passer par référence, vous devez inclure la taille, mais vous pouvez le faire en utilisant un modèle:
void pass(GoldenHelmet (&h)[10])
?Le C++ façon:
En effet, nous passons le tableau par référence.
Ce sont tous les possibles, mais aucun d'eux n'est le passage par valeur. Il suffit de penser de
ofMambrino
comme étant l'adresse du début du tableau, et c'est ce que vous êtes de passage.Les tableaux sont représentés et transmis comme des pointeurs, de sorte que vous ne sont pas la copie de quoi que ce soit ici. En revanche, si vous avez été en passant un unique
struct
, il serait passé par valeur.Ci-dessous est un extrait de code pour illustrer ce dernier point:
Tout d'abord matrice n'est pas de pointeurs. Nous appelons cela comme un pointeur dans la liste d'arguments, parce que quand nous utilisons
x est const pointeur qui pointe le début du tableau. Et quand vous passez à une fonction de vous envoyer l'adresse de la mémoire qui est le début de la matrice. C'est pourquoi, lorsque vous effectuez un changement dans votre fonction, vous faites le changement dans l'adresse de la variable en l'appelant l'article en fait. C'est effectivement simulé appel par référence, pas d'appel par référence. Mais l'effet est le même avec appel par la référence que vous travailliez sur des emplacements de mémoire. Pour cette raison, lorsque vous envoyez un tableau de votre struct vous passez effectivement adresse de votre tableau de structures. C'est pourquoi, lorsque vous modifiez la valeur de cela, vous fait changer vos structures.
À utiliser appel par référence, une chose que vous devez faire est de définir votre prototype de fonction comme
et lors de l'appel de fonction, il en est de même avec les autres.
Pour résumer: