2013-01-04 2 views
0

J'apprends C++ et je l'ai trouvé sur un livre:Pointeurs et opérateur de référence (&)

#include <iostream> 
using namespace std; 

int main() 
{ 
int Age = 30; 
int* pInteger = &Age; // pointer to an int, initialized to &Age 

// Displaying the value of pointer 
cout << “Integer Age is at: 0x” << hex << pInteger << endl; 

return 0; 
} 

Le livre dit que la sortie est l'adresse en mémoire où l'âge est stocké.

Mais le livre ne parle pas de ceci:

*pInteger = &Age; 
pInteger = &Age; 

Quelle est la différence entre ces deux missions?

+0

Le symbole '&' lorsqu'il est utilisé avec un type, déclare une référence. Lorsqu'il est utilisé avec une variable, renvoie l'adresse ou l'emplacement de la variable. Exemple: 'int &' - déclare une référence; "& Age" - renvoie l'emplacement de 'Age'. –

Répondre

6

Vous semblez être confondu par cette ligne

int* pInteger = &Age; // pointer to an int, initialized to &Age 

Le symbole * ici est PInteger comme déclarant pointeur vers un int. Ceci est initialisé (non assigné) à l'adresse de Age qui est permise car Age est un int.

Vous pouvez taper

*pInteger = 45; 

et qui serait attribuer à l'entier à qui points PInteger.

Vous pouvez également taper

int y = 35; 
pInteger = &y; 

qui serait réaffectant le pointeur pour pointer vers un endroit différent.

2

int* pInteger = &Age; n'est pas une affectation, mais une initialisation. Ici, * fait partie du type - int*, pas de l'entier *pInteger, comme ci-dessous.

deux vous poser des questions sur: sont les affectations

*pInteger = &Age; 
pInteger = &Age; 

La différence est que le premier est illégal, le second est OK. C'est parce que &Age a le type int*, tandis que *pInteger a le type int, et il est illégal d'attribuer un int* à un int. pInteger, cependant, a le type int*, donc l'affectation est OK.

1

pInteger est un pointeur vers int, et il est initialisés à l'adresse de Age dans le premier cas (en supposant que vous vouliez dire int*pInteger = &Age;) et attribué dans le second cas.

3

Il serait probablement plus facile à comprendre si vous cassez cette

int* pInteger = &Age; 

en deux étapes

int* pInteger; 

delares une variable de pointeur de type int, puis

pInteger = &Age; 

attribue l'adresse Age à pInteger, de sorte que pInteger pointe maintenant sur un entier spécifique.

Si vous avez écrit

*pInteger = 95; 

vous affecter une nouvelle valeur à tout ce PInteger pointe actuellement.

Lorsque vous écrivez

int* pInteger = &Age; 

vous déclarez la variable et de lui donner une valeur initiale, de sorte que ce n'est pas la même chose que l'apparence similaire

*pInteger = &Age; 

qui utilise PInteger mais pas déclarer Donc, ici, vous obtenez l'adresse de Age et vous essayez de l'assigner à la chose à laquelle pInteger pointe, assignant une adresse à un int n'étant pas une bonne chose à faire.

1

Tout d'abord, nous déclarons et initialiser une variable de type int*

 int*  pInteger =   &Age; 
//| var type | var name | | value of type "int*" | 

Ensuite, nous essayons d'utiliser l'affectation:

  pInteger  =   &Age; 
//| var of type "int*" | | value of type "int*" | 
     *pInteger  =   &Age; 
//| var of type "int" | | value of type "int*" | 

Le dernier est incorrect jusqu'à ce que nous jetons int* à int (Si notre objectif est utiliser l'adresse comme valeur entière). Opérateur de déréférencement de l'opérateur unaire * signifie que nous avons besoin de quelque chose situé à l'adresse spécifiée.

Questions connexes