C++ en Passant le Pointeur de Fonction (Howto) + C++ Manipulation du Pointeur
Je suis un peu confus quant à la façon dont le passage de pointeurs œuvres.
Disons que j'ai la fonction suivante et pointeur, et...
MODIFIER:
...Je veux utiliser un pointeur à un objet comme argument dans la fonction.
c'est à dire:
void Fun(int Pointer){
int Fun_Ptr = ---Passed Pointer---;
//So that Fun_Ptr points to whatever ---Passed Pointer points to
Entre l' *Pointeur et &Pointeur de notations, je suis très confus. Je sais que *Pointeur signifie donner ce qu'il pointe.
Dois-je mettre void (int *pointeur) dans la déclaration. Ce sujet lorsque j'utilise la fonction?
Votre aide est appréciée.
EDIT 2:
Ok, je comprends maintenant que l'utilisation de *variable dans une déclaration signifie qu'un pointeur sera passé. Cependant, ce sujet lorsque j'utilise la fonction?
c'est à dire
int main(){
int foo;
int *bar;
bar = foo;
Fun(bar);
}
EDIT 3:
Ok, donc corrigez-moi si je me trompe:
Selon les conventions du code ci-dessus:
bar = &foo signifie: Faire de la barre de point de foo dans la mémoire
*bar = foo signifie Modifier la valeur de la barre de points à égalité quel que soit foo est égal à
Si j'ai un deuxième pointeur (int *absence du bureau), puis:
bar = absence de moyens: la barre de points à l'absence de pointeur
bar = *absence de moyens: la barre de points à la valeur que l'absence de points, mais pas à l'absence de pointeur lui-même
*bar = *absence de moyens: modifier la valeur de la barre de points à la valeur que l'absence de points de
&bar = &absence de moyens: changement de l'adresse de mémoire que la barre de points pour être le même que l'adresse de la mémoire que l'absence de points de
Dois-je avoir ce droit?
EDIT 4: Merci beaucoup pour votre aide (je souhaite que je pourrais accepter plus de 1 réponse, mais je dois aller avec le premier. Je ne suis pas sûr de savoir comment une communauté wiki fonctionne exactement, mais je vais laisser cela de cette façon pour l'édition (n'hésitez pas à en faire une référence de guide si vous le souhaitez).
- Votre deuxième édition est presque correct, cependant
- "Est-ce exact?". Pas de. Vous ne voulez pas
bar
être égale àfoo
, vous voulez qu'il point àfoo
. Ceci est fait avec l'adresse de l'exploitant.bar = &foo;
. - bar = foo, n'est pas valide, que foo est un int et un bar un pointeur. Le code correct est "bar = &foo" parce que, comme un pointeur, la barre ne peut stocker que des adresses de mémoire pas un int. Désolé pour le commentaire des réponses.
- Rappelez-vous, la barre de points à la variable foo, et donc, si vous changez foo, parce que seulement dans le bar des références foo, la prochaine fois que vous utilisez la barre d'il permettra également de tenir compte de ce changement.
- Déplacé, supprimé le commentaire à la question elle-même, donc au-dessus de commentaire, c'est la pendaison (désolé)
- Aussi, j'ai fait un Wiki de la communauté, car ce serait une pratique de référence courte (je vais changer le titre pour refléter cet)
- J'ai ajouté des réponses pour les 3 à ma réponse.
Vous devez vous connecter pour publier un commentaire.
Il y a une différence dans l' * utilisation lorsque vous définissez une variable et lorsque vous l'utilisez.
Dans la déclaration,
Signifie un pointeur vers un type de données entier. Dans son usage, cependant,
Moyens de déréférencer le pointeur et de rendre la structure, il est de pointage égal à trois, plutôt que de faire le pointeur égale à l'adresse de la mémoire 0x 0003.
Dans votre fonction, vous voulez faire cela:
Dans la déclaration de la fonction, * signifie que vous passez un pointeur, mais dans son code réel du corps * signifie que vous accédez à ce que le pointeur pointe à.
Dans une tentative de faire des vagues au loin la confusion que vous avez, je vais brièvement l'esperluette (&)
& des moyens d'obtenir l'adresse de quelque chose, sa position exacte dans la mémoire des ordinateurs, de sorte
Dans une déclaration signifie que l'adresse d'un entier ou un pointeur!
Ce cependant
Signifie faire de la pInteger pointeur lui-même (rappelez-vous, les pointeurs sont juste des adresses de mémoire de ce qu'ils pointent) égale à l'adresse de "someData' - alors maintenant, pInteger se pointer à certaines données, et peut être utilisé pour y accéder lorsque vous déférence c':
Cela fait-il sens pour vous? Est-il autre chose que vous trouvez confus?
@Edit3:
Près correct, sauf pour les trois états
signifie que la barre de pointeur est égal à un entier, pas ce que la barre de points, ce qui n'est pas valide.
&bar = &oof;
L'esperluette est comme une fonction, une fois qu'il retourne une adresse de mémoire vous ne pouvez pas modifier d'où il vient. Tout comme ce code:
Est pas valide, donc, est la vôtre.
Enfin,
Ne signifie pas que "de la barre de points à l'absence de pointeur." Plutôt, cela signifie que la barre de points à l'adresse que l'absence de points, de sorte que la barre de points à ce que foo est pointé à - pas de la barre de points de foo qui points de ouf.
De déclarer une fonction qui prend un pointeur vers un int:
void Foo(int *x);
Pour utiliser cette fonction:
Si vous voulez un pointeur pour un autre type d'objet, il est plus ou moins la même:
void Foo(Object *o);
Mais, vous préférerez peut-être utiliser des références. Ils sont un peu moins confus que des pointeurs:
Avec des références, vous obtenez toujours de changer le x qui a été transmis à la fonction (comme vous le feriez avec un pointeur), mais vous n'avez pas à vous soucier de déférence ou de l'adresse de l'exploitation.
Comme recommandé par d'autres, découvrez l' C++FAQLite. C'est une excellente ressource pour cette.
Modifier 3 réponse:
bar = &foo signifie: Faire de la barre de point de foo dans la mémoire
Oui.
*bar = foo signifie Modifier la valeur de la barre de points à égalité quel que soit foo est égal à
Oui.
Si j'ai un deuxième pointeur (int *absence du bureau), puis:
bar = absence de moyens: la barre de points à l'absence de pointeur
barre de point à quelque ouf points. Ils pointent vers la même chose.
bar = *absence de moyens: la barre de points à la valeur que l'absence de points, mais pas à l'absence de pointeur lui-même
Pas. Vous ne pouvez pas faire cela (en supposant que la barre est de type int *) Vous pouvez faire le pointeur de pointeurs. (int **), mais ne parlons pas que... Vous ne pouvez pas affecter un pointeur vers un int (eh bien, vous pouvez, mais c'est un détail qui n'est pas en ligne avec la discussion).
*bar = *absence de moyens: modifier la valeur de la barre de points à la valeur que l'absence de points de
Oui.
&bar = &absence de moyens: changement de l'adresse de mémoire que la barre de points pour être le même que l'adresse de la mémoire que l'absence de points de
Pas. Vous ne pouvez pas faire cela parce que l'adresse de l'opérateur renvoie une rvalue. Fondamentalement, cela signifie que vous ne pouvez pas affecter de quelque chose.
Pour passer un pointeur vers un int, il devrait être
void Fun(int* pointer)
.De passer une référence à un int ressemblerait à ceci...
Si vous souhaitez passer un pointeur de int dans votre fonction,
Déclaration de la fonction (si vous en avez besoin):
Définition de la fonction:
Utilisation de la fonction:
Remarque en règle générale, que des variables appelées
Ptr
ouPointer
ne devrait jamais avoir le typeint
, qui est ce que vous avez ensuite dans votre code. Un pointeur vers int a typeint *
.Il signifie "faire de la barre de point à la même chose absence de points".
Qui ne veut rien dire, il est invalide.
bar
est un pointeur*oof
est un int. Vous ne pouvez pas affecter de l'un à l'autre.Oui.
Non, c'est non valide de nouveau.
&bar
est un pointeur vers labar
variable, mais c'est ce qu'on appelle un "rvalue" ou "temporaire", et il ne peut pas être attribué. C'est comme le résultat d'un calcul arithmétique. Vous ne pouvez pas écrirex + 1 = 5
.Il pourrait vous aider à penser à des pointeurs comme des adresses.
bar = oof
signifie "faire de la barre, qui est une adresse, l'égalité d'absence du bureau, qui est également une adresse".bar = &foo
signifie "faire de la barre, qui est une adresse, égale à l'adresse de foo". Sibar = *oof
signifiait quelque chose, il signifie "faire de la barre, qui est une adresse, égal à*oof
, qui est un int". Vous ne pouvez pas.Puis,
&
est l'adresse de l'exploitant. Il signifie "l'adresse de l'opérande", donc&foo
est l'adresse de foo (j'.e, un pointeur de toto).*
est l'opérateur de déréférencement. Il signifie "la chose à l'adresse indiquée par l'opérande". Donc, avoir faitbar = &foo
,*bar
estfoo
.* avant le pointeur désigne le contenu du pointeur de la souris (à l'exception, dans des déclarations!)
& avant que le pointeur (ou une variable) désigne l'adresse
EDIT:
vous permettra de manipuler le contenu de ce 'Pointeur' points par référence à l'intérieur du Plaisir de la fonction c'est à dire
déclarant comme ci-dessus vous permet également de manipuler les données au-delà de ce qu'il désigne:
dans la fonction, vous pouvez alors faire comme *(Pointeur + 1) = 12; la définition de la matrice de la 2ème valeur.
vous pouvez modifier le type Pointeur de références, mais dans ce cas, vous ne pouvez pas accéder au-delà de ce Pointeur de références.
Il peut être plus facile pour vous de comprendre à l'aide de Functionoids qui sont expressément plus propres et plus puissant à utiliser, voir cet excellent et très recommandé C++ FAQ lite, en particulier, consultez la section 33.12-là, mais néanmoins, le lire depuis le début de cet article, de connaître et de comprendre de lui.
Pour répondre à votre question:
Edit:
&
signifie que l'adresse de référence*
signifie que la valeur de ce qui est contenu à l'adresse de référence, appelé de référencement deDonc, en utilisant la référence, l'exemple ci-dessous, montre que l'on passe en paramètre, et de modifier directement elle.