Langage C++
TD Pointeur
01/10/03David Saint-Mellion page 1/2
1. Qu’est ce qu’un pointeur ?
2. Quelle diffé rence y a t-il entre les instructions int nbre=5566 et int *variable=&nbre ? Quelle différence y a t-il entre int var = 55567 et int &y=var ?
3. On déclare int nbre=0. Que représente nbre en terme d’implantation dans la machine informatique ? 4. On réalise la séquence ci-dessous. Donnez les valeurs à l’issue de l’exécution de chaque instruction.
&car car *ptrNbre ptrNbre
char car = 0x35 ; 0x0066fe80 char *ptrNbre=&car ;
*ptrNbre = 0x37 ; car=0x39 ;
ptrNbre++ ;
5. Soit la séquence ci-dessous
1 2 3 4
short nbre = 1000 ; short &refNbre = nbre ; const short *ptr1 = &nbre ; short *const ptr2 = &nbre ;
Parmi les instructions de 1 à 4, quelles sont celles qui sont équivalentes ?
5 6 7 8 9 10 11
12 13
14
15
nbre++ ; refNbre++ ; ptr1++ ; ptr2++ ;
*ptr1 = 0X1111 ;
*ptr2 = 0X2222 ; if (*ptr1==0) {
//--- ; }
for(int i=0 ;i<50 ;i++){
refNbre=i+ptr2 ; //--- ; }
do {
//--- ; } while((*ptr1)++!=0);
while((*ptr2)++==0){
//--- ; }
Parmi les instructions, quelles sont celles qui sont illicites ?
Quel est le résultat de l’exécution des l’instructions :
sizeof(refNbre) sizeof(ptr1)
6. Soit la séquence ci-dessous :
short dimension[8] = {150, 202, 331,440} ;
short *ptr = dimension ; // Remarque : dimension vaut 0x00CC8800 short *ptr2 = &dimension[2] ;
short x1 = 0 ; short x2 = 0 ; short x3 = 0 ;
x1 = *ptr ; ptr = ptr+3 ; x2 = *ptr ; x3 = (*ptr)+1 ; ptr = ptr+2 ; dimension++;
(*dimension)++;
Quelle est l’instruction illicite ?
La séquence est exécutée, complétez le tableau ci-après.
Langage C++
TD Pointeur
01/10/03David Saint-Mellion page 2/2
Valeur à l’issue de l’exécution de la séquence ptr2
*ptr2 x1 x2 x3 ptr
*ptr
dimension[0]
7. On dispose de 50 000 éléments stockés en mémoire de manière contiguë. Les éléments sont des valeurs codées sur 2 octets. L’adresse du premier élément se situe à l’adresse 0x0066fe00. On dispose d’une variable nommé tab qui contient cette valeur d’adresse.
§ De quel type de base du langage C++ est un des éléments stocké en mémoire ? Donnez l’instruction qui permet de déclarer une variable pointeur sur le premier élément stocké. Cette variable se nomme ptrDebut.
§ On définit un pointeur sur le dernier élément qui se nomme ptrFin. Donnez l’instruction qui permette de le déclarer.
§ Proposez une instruction qui affecte la valeur 0X3503 au 3ème élément.
§ On veut compter combien d’éléments ont la valeur 0. Proposez l’élément de programme qui réalise cette opération. Vous utiliserez une instruction for avec une variable de boucle initialisée à 0.
§ On veut connaître l’index du premier l’élément qui à la valeur 99. Un élément du tableau a au moins cette valeur.
Donnez l’élément de programme qui réalise cette opération.
8. Soit un composant de communication.
Il est constitué de 3 registres : Contrôle, Emission, Réception. Les registres contiennent des valeurs codées sur 8 bits.
Ces registres sont implantés aux adresses suivantes : - Contrôle à Adresse de base + 1
- Emission à Adresse de base + 3 - Réception à Adresse de base + 5
« Adresse de base » est une valeur codée sur 32 bits. On définit 3 variables : regControle, regEmission et regReception, de type pointeur pour représenter les registres. On dispose d’une fonction fAdeBase()qui retour la avleur de « Adresse de Base ».
Elle est typée comme suit : *char fAdeBase(void)
§ Que retourne la fonction fAdeBase() ;
§ De quel type de base du langage C++ sont les objets stockés dans les registres ?
§ Proposez le code d’une séquence qui déclare et initialise les variables regControle, regEmission et regReception.
§ Donnez l’instruction qui pose la valeur 0x39 dans le registre Emission.
§ Donnez l’instruction qui prélève le contenu du registre Réception et affecte la valeur à la variable carLu.
§ Que représente l’opération regReception-regControle ?
9. Le composant est modélisé par une classe « ComposantCom ».
Elle comprend :
3 attributs qui représentent les adresses des 3 registres . 3 méthodes :
le constructeur // Initialise les attributs à partir de l’adresse de base passée en paramètre lireRéception() // Retourne la valeur contenue dans le registre de Réception
ecrireEmission() // Pose la valeur passée en paramètre dans le registre d’Emission
• Donnez la déclaration de la classe en langage C++ .
• Donnez le corps des fonctions de la classe codé en langage C++.
• Proposez le fragment de code qui permettra d’instancier cette classe. La fonction fAdeBase()sera mise en œuvre pour obtenir Adresse de Base.