Exercice 1 : Programme de démonstration des pointeurs
Exercice 1 :
⇒ ajouter à ce programme les tests suivants :
- incrémentation de la valeur pointée par ad1 , puis afficher l’adresse pointée par ad1 , l’adresse de ad1 et la valeur à l'adresse pointée par ad1.
- incrémentation du contenu de ad1 , puis afficher l’adresse pointée par ad1 , l’adresse de ad1 et la valeur à l'adresse pointée par ad1.
⇒ Est-ce prudent de réaliser ce 2 ème test ?
#include <iostream>
int main(){
int * ad1, * ad2;
std::cout << "##### Informations sur les pointeurs #" << std::endl;
std::cout << "##### int * ad1, * ad2;" << std::endl;
std::cout << "Adresse pointée par ad1 : ad1==" << ad1 << std::endl;
std::cout << "Adresse de ad1 : &ad1==" << &ad1 << std::endl;
/* la ligne suivante provoque une erreur de segmentation dans le programme
car on ne peut pas accéder à l'espace mémoire '0x0' ! */
/* std::cout << "Valeur à l'adresse pointée par ad1 : *ad1==" << *ad1 << std::endl; */
std::cout << "Adresse pointée par ad2 : ad1==" << ad2 << std::endl;
std::cout << "Adresse de ad2 : &ad2==" << &ad2 << std::endl << std::endl;
int n = 10, p = 20;
std::cout << "##### Informations sur les entiers #" << std::endl;
std::cout << "##### int n = 10, p = 20;" << std::endl;
std::cout << "Adresse de n : &n==" << &n << std::endl;
std::cout << "Valeur de n : n==" << n << std::endl;
std::cout << "Adresse de p : &p==" << &p << std::endl;
std::cout << "Valeur de p : p==" << p << std::endl << std::endl;
ad1 = &n;
ad2 = &p;
std::cout << "##### Informations sur les pointeurs après pointage sur des adresses
d'entiers existants #" << std::endl;
std::cout << "##### ad1 = &n;" << std::endl;
std::cout << "##### ad2 = &p;" << std::endl;
std::cout << "Adresse pointée par ad1 : ad1==" << ad1 << std::endl;
std::cout << "Adresse de ad1 : &ad1==" << &ad1 << std::endl;
/* désormais que l'adresse n'est plus '0x0', on peut accéder à la valeur */
std::cout << "Valeur à l'adresse pointée par ad1 : *ad1==" << *ad1 << std::endl;
std::cout << "Adresse pointée par ad2 : ad1==" << ad2 << std::endl;
std::cout << "Adresse de ad2 : &ad2==" << &ad2 << std::endl;
std::cout << "Valeur à l'adresse pointée par ad2 : *ad2==" << *ad2 << std::endl <<
std::endl;
*ad1 = *ad2 + 3;
std::cout << "##### Informations sur les pointeurs et les variables entières #" <<
std::endl;
std::cout << "##### *ad1 = *ad2 + 3;" << std::endl;
std::cout << "Adresse de n : &n==" << &n << std::endl;
std::cout << "Valeur de n : n==" << n << std::endl;
std::cout << "Adresse de p : &p==" << &p << std::endl;
std::cout << "Valeur de p : p==" << p << std::endl;
std::cout << "Adresse pointée par ad1 : ad1==" << ad1 << std::endl;
std::cout << "Adresse de ad1 : &ad1==" << &ad1 << std::endl;
std::cout << "Valeur à l'adresse pointée par ad1 : *ad1==" << *ad1 << std::endl;
std::cout << "Adresse pointée par ad2 : ad1==" << ad2 << std::endl;
std::cout << "Adresse de ad2 : &ad2==" << &ad2 << std::endl;
std::cout << "Valeur à l'adresse pointée par ad2 : *ad2==" << *ad2 << std::endl <<
std::endl;
ad2 = ad1;
std::cout << "##### Informations sur les pointeurs #" << std::endl;
std::cout << "##### ad2 = ad1;" << std::endl;
std::cout << "Adresse de n : &n==" << &n << std::endl;
std::cout << "Valeur de n : n==" << n << std::endl;
std::cout << "Adresse de p : &p==" << &p << std::endl;
std::cout << "Valeur de p : p==" << p << std::endl;
std::cout << "Adresse pointée par ad1 : ad1==" << ad1 << std::endl;
std::cout << "Adresse de ad1 : &ad1==" << &ad1 << std::endl;
std::cout << "Valeur à l'adresse pointée par ad1 : *ad1==" << *ad1 << std::endl;
std::cout << "Adresse pointée par ad2 : ad1==" << ad2 << std::endl;
std::cout << "Adresse de ad2 : &ad2==" << &ad2 << std::endl;
std::cout << "Valeur à l'adresse pointée par ad2 : *ad2==" << *ad2 << std::endl <<
std::endl;
/* les lignes suivantes provoquent des erreurs car l'accès à la mémoire en adresse
0x7ffd25ec2368 n'est pas autorisé hors zone du programme. Cela dépend du système
d'exploitation et de sa gestion mémoire.
*/
/*
ad1 = (int *) 0x7ffd25ec2368;
std::cout << "Adresse pointée par ad1 : ad1==" << ad1 << std::endl;
std::cout << "Adresse de ad1 : &ad1==" << &ad1 << std::endl;
std::cout << "Valeur à l'adresse pointée par ad1 : *ad1==" << *ad1 << std::endl;
*/
std::cout << "Adresse pointée par ad1 : " << ad1 << std::endl;
std::cout << "Adresse de ad1 : &ad1" << &ad1 << std::endl;
std::cout << "Valeur du contenu pointée incrémenté par adl : ++(*ad1) =" << ++(*ad1) << std::endl;
std::cout << "Adresse pointée par ad1 : " << ad1 << std::endl;
std::cout << "Adresse de ad1 &ad1 " << &ad1 << std::endl;
std::cout << "Valeur du contenu de ad1 incrémenté : ++ad1 = " << ++ad1 << std::endl;
return 0;
}
- Incrémentation
J'ai ajouté l'incrémentation de la valeur pointée par ad1 :
std::cout << "Adresse pointée par ad1 : " << ad1 << std::endl;
std::cout << "Adresse de ad1 : &ad1" << &ad1 << std::endl;
std::cout << "Valeur du contenu pointée incrémenté par adl : ++(*ad1) =" << ++(*ad1) << std::endl;
J'ai ajouté l'incrémentation du contenu de ad1 :
std::cout << "Adresse pointée par ad1 : " << ad1 << std::endl;
std::cout << "Adresse de ad1 &ad1 " << &ad1 << std::endl;
std::cout << "Valeur du contenu de ad1 incrémenté : ++ad1 = " << ++ad1 << std::endl;
Le résultat est :
Adresse pointée par ad1 : 0x7ffe1cd9e9bc
Adresse de ad1 : &ad10x7ffe1cd9e9c8
Valeur du contenu pointée incrémenté par ad1 : ++(*ad1) =24
Adresse pointée par ad1 : 0x7ffe1cd9e9c0
Adresse de ad1 &ad1 0x7ffe1cd9e9c8
Valeur du contenu de ad1 incrémenté : ad1++ = 0x7ffe1cd9e9c4
Edited by Tanguy DEFAIT