Leçons du module (2/2)
Pointeurs
Les pointeurs sont l'une des fonctionnalités les plus puissantes et distinctives du C++. Ils permettent d'accéder directement à la mémoire physique de l'ordinateur, offrant une gestion efficace des ressources et des performances élevées.
1. Qu'est-ce que la mémoire et une adresse ?
Chaque variable que vous déclarez dans votre programme est stockée dans une cellule de la mémoire RAM. Chaque cellule possède une adresse mémoire unique (généralement exprimée au format hexadécimal, ex. 0x7ffee3bf87ac).
C++ nous permet d'obtenir l'adresse mémoire de n'importe quelle variable à l'aide de l'opérateur d'adresse & :
int x = 42;
std::cout << &x; // Stampa l'indirizzo di memoria di x (es. 0x7ffee3bf87ac)
2. Définition d'un pointeur
Un pointeur est une variable spéciale qui stocke comme valeur l'adresse mémoire d'une autre variable.
La syntaxe prévoit l'utilisation de l'astérisque * après le type de donnée :
int x = 42;
int* ptr = &x; // ptr è un puntatore a intero che contiene l'indirizzo di x
3. L'opérateur de déréférencement (*)
Pour accéder ou modifier la valeur stockée à l'adresse pointée par un pointeur, nous utilisons l'opérateur de déréférencement (ou d'indirection), également représenté par le symbole * :
int x = 42;
int* ptr = &x;
std::cout << *ptr; // Stampa 42 (il valore a cui punta ptr)
*ptr = 100; // Modifica il valore di x tramite il puntatore
std::cout << x; // Ora stampa 100!
4. Pointeurs nuls : nullptr
Un pointeur qui ne pointe vers aucune adresse valide doit être initialisé avec le mot-clé nullptr (introduit en C++11) :
int* ptr = nullptr; // Puntatore nullo e sicuro
À vous de jouer
Dans le main se trouve une variable value initialisée à 42. Déclarez un pointeur vers un entier ptr qui pointe vers l'adresse de value. Utilisez le déréférencement de ptr pour définir la valeur de value à 100, puis affichez value à l'aide de std::cout.
Afficher l'indice
Déclarez le pointeur avec `int* ptr = &value;`, modifiez la valeur en déréférençant `*ptr = 100;`, et affichez `std::cout << value;`.
Solution disponible après 3 tentatives
Définissez une fonction doubleValue qui accepte un pointeur vers un entier (int* ptr) et multiplie par 2 la valeur vers laquelle il pointe (si le pointeur n'est pas nul). Dans le main, appelez doubleValue en lui passant l'adresse de la variable num et affichez-la.
Afficher l'indice
La fonction doit accepter `int* ptr`. À l'intérieur, utilisez `*ptr = (_ptr) _ 2`. Dans le main, appelez-la avec `doubleValue(&num);`.
Solution disponible après 3 tentatives
Étant donné le code fourni, quelle expression permet de modifier directement la valeur de a en la définissant sur 10 ?
int a = 5;
int* p = &a;
// quale istruzione assegna 10 ad a?