TD6 Corrige

Vous aimerez peut-être aussi

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 6

ECOLE PRÉPARATOIRE DES SCIENCES ET TECHNIQUES – ANNABA

Année Universitaire 2012-2013


Informatique 2eme année
Travaux Dirigés No 6
Les Pointeurs
1. Répondre à ce qui suit :
a. Un pointeur est une variable qui contient __________ de la valeur d'une autre variable.
b. Les trois valeurs qui peuvent être employées pour initialiser un pointeur sont ___________,
_________ et ________.
c. Le seul nombre entier qui peut être assigné directement à un pointeur est le ___________.

a) address.
b) 0, NULL, an address.
c) 0
2. Déterminer dans ce qui suit le vrai du faux. Si la réponse est fausse, expliquer pourquoi.
a. L'opérateur d'adresse & peut être appliqué seulement aux constantes et aux expressions.
b. Un pointeur qui est déclaré de type void * peut être déréférencé.
a. Faux. L'opérande de l'opérateur d'adresse doit être une variable ; l'opérateur d'adresse
ne peut pas être appliqué aux constantes ou aux expressions qui n'ont pas d'adresses en
mémoire.
b. Faux. Un pointeur pour void ne peut être déréférencé. Un tel pointeur n'a pas un type
qui permet au compilateur de déterminer le nombre de bytes de mémoire pour
déréférencer et le type des données vers lesquelles le pointeur pointe.
3. Soit l'état de la mémoire suivant :
Variable Type Adresse mémoire Valeur
i int 000A 20
... ... ... ...
j int 00A1 15
k int ? 20
... ... ... ...
iptr int * 00C0 000A
... ... ... ...
jptr int * 00D0 00A1
... ... ... ...
kptr int * 00E0 00A5
a. Donnez l’adresse de la variable k sachant qu’elle se situe juste après la variable j dans la mémoire et
que la taille du type int est 4 bytes.
b. Donnez la valeur de chacune des expressions suivantes :
Expression Valeur
i
j
&i
(*kptr == i)
i + *iptr
*iptr + *jptr
&iptr
(*iptr == *kptr)
(*iptr % *jptr)
Solution :
a. 00A5
b. 20 , 15 , 000A , true , 40 , 35 , 00C0 , true , 5
4. Soit le fragment de programme suivant :
int i = 6;
int j = i;
int * iptr = &i;
int * jptr = &j;
int * kptr = &i;
(*kptr)++;

Après l’execution du fragment de programme précédent, donnez la valeur de chacune des expressions
suivantes :
Expression Valeur Solution
i 7
j 6
(i==j) false
*iptr 7
(iptr == kptr) true
(*iptr > j) true
5. Déclarer un pointeur nPtr qui pointe vers une variable de type double
double * nptr;
6. Pour chacun des cas suivants, écrire un instruction qui effectue la tâche correspondante. Supposer
que les variables flottantes number1 et number2 ont été déclarées et que number1 a été initialisé à 7.3.
a. Déclarer la variable fPtr comme etant un pointeur vers un objet de type float.
b. Assigner l'adresse de la variable number1 au pointeur fPtr.
c. Imprimer la valeur pointée par fPtr.
d. Assigner la valeur pointée par fPtr à la variable number2.
e. Imprimer la valeur de number2.
f. Imprimer l'adresse de number1.
g. Imprimer l'adresse stockée dans le fPtr. La valeur imprimée est-elle la même que l'adresse de
number1 ?

a. float * fPtr;
b. fPtr = &number1;
c. cout << *fPtr;
d. number2 = *fPtr;
e. cout << number2;
f. cout << &number1;
g. cout << fPtr; Oui c'est la même

7. Répondre à chacun des cas suivants :


a. Écrire l'en-tête de fonction pour une fonction appelée exchange avec deux pointeurs à des
nombres en double précision x et y comme paramètres et ne renvoie pas de valeur.
b. Écrire deux instructions différentes permettant, chacune d’initialiser un tableau de caractères
vowel avec la chaine, « AEIOU ».

a. void exchange(double * x, double * y)


b. char vowel[] = “AEIOU”;
char vowel[] = {'A','E','I','O','U','\0'};

8. Trouver l'erreur dans chacun des segments de programme suivants. Assumer les déclarations et les
instructions suivantes :

int *zPtr;
int *aPtr = 0;
void *sPtr = 0;
int number;
int z[ 5 ] = { 1, 2, 3, 4, 5 };
zptr = z;

a. ++z;
b. number = zPtr;
c. for ( int i = 0; i <= 5; i++ )
cout << zPtr[ i ] << endl;
d. number = *sPtr;
a. Même si un tableau est un pointeur. On ne peut pas l'incrémenter car les
tableaux sont des pointeurs constants.
b. Types incompatibles. On ne peut pas assigner une adresse à un entier.
c. Quand i sera égale à 5, on sortira des limites du tableau.
d. On ne peut pas déréférencer un pointeur NULL et on ne peut pas déréférencer un
pointeur vers void.
9. Ecrire une instruction qui affiche l’adresse de la variable testvar

cout << &testvar;

10. Le contenu de deux pointeurs qui pointent vers des variables adjacentes de type float diffèrent de ___________.

4 bytes

11. Un pointeur est


a. l'adresse d'une variable.
b. une indication de la variable qui va être accédée ultérieurement.
c. une variable pour stocker des adresses.
d. le type de données d'une variable d'adresse.

12. Écrire les expressions pour ce qui suit :


a. L’adresse de la variable var
b. Le contenu de la variable indiquée par le pointeur pvar
c. Le type de données pointeur-char

a. &var
b. *pvar
c. char*

13. Une adresse est un/une _____________, alors qu’un pointeur est un/une ____________.

constante; variable

14. Les pointeurs sont utiles pour référencer une adresse mémoire qui n’a pas de _______________.

Nom ou identifiant.

15. Si un pointeur testptr indique une variable testvar, écrire une instruction qui représente le contenu
de testvar mais n'emploie pas son nom.

*testptr

16. Un astérisque placé après un type de données signifie _________.


Un astérisque placé avant un nom de variable signifie ______________

pointeur vers, contenu de la variable pointée par

17. Est-ce-que le code suivant est correcte?


int intvar = 333;
int* intptr;
cout << *intptr;
Non. On ne peut pas déréférencer un pointeur qui n'a pas été initialisé avec l'adresse d'une
variable.

18. On peut affecter à un pointeur vers void des pointeurs sur _______.

N’importe quel type de données

19. Quelle est la différence entre intarr[3] et *(intarr+3)?

Aucune, toutes les deux indiquent la même case mémoire

20. Ecrire les lignes de codes qui utilisent un pointeur pour afficher toutes les valeurs d’un tableau de
77 éléments.

for(int j=0; j<77; j++)


cout << endl << *(intarr+j);

21. Si intarr est un tableau d’entiers, pourquoi l’expression intarr++ n’est pas
correcte?

Parce que les noms de tableau représentent l'adresse du tableau, qui est une constante et ne peut
pas être changée (lun tableau est un pointeur constant)

22. Des trois manières de passer des arguments aux fonctions, seulement en passant par le/la
________ et en passant par le/la ________ permettent à la fonction de modifier l'argument dans le
programme d'appel.

Référence ; pointeur vers type

23. En utilisant la notation de pointeur, écrire un prototype (déclaration) pour une fonction appelée
func() qui retourne un type void et prend un argument qui est un tableau de type char.

void func(char*);

24. En utilisant la notation de pointeur, écrire le code qui transférera 80 caractères à partir de la chaine
(string) S1 à la chaine (string) s2.

for(int j=0; j<80; j++)


*(s2+j) = *(s1+j);

25. Le premier élément dans une chaine de caractère est


a. le nom de la chaine.
b. le premier caractère dans la chaine.
c. la longueur de la chaine.
d. le nom du tableau prenant en compte la chaine.

26. En utilisant la notation de pointeur, écrire le prototype pour une fonction appelée le revstr () qui
retourne une valeur de type chaine et prend un argument qui représente une chaine.
char* revstr(char*);

27. Écrire une définition pour un tableau numptrs de pointeurs vers les chaines de caractères “One”,
“Two”, “Three”.

char* numptrs[] = { “One”, “Two”, “Three” };

28. L’opérateur new


a. Crée une variable appelée new.
b. Demande au système d'exploitation d'allouer de la mémoire.
c. Retourne un pointeur vers une case mémoire.
d. Imprime la mémoire disponible.

b, c

29. L'opérateur de suppression delete demande au système d'exploitation de libérer la __________ .

case mémoire indiqué par un pointeur.

30. Soit le fragment de programme suivant :


int * p = new int;
*p = 12;
int * q = p;
*p = 15;
p = new int;
*p = 25;

Quel est la valeur pointée par p et q après l'execution des instructions précédentes ?

*p = 25, *q = 15

Vous aimerez peut-être aussi