Structures de données IFT Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009
Test#1 a- Il y aura erreur de compilation b- Il y aura un accès à une zone mémoire indéterminée ou invalide c- Le code s'exécutera sans erreur int a, *b, **c;Réponse (a, b ou c) : ___ c = (int *)&a; **c = 5;
Test #2 Qu’affiche le programme suivant? Comment réagit votre compilateur à la compilation? A-t-il raison (est ce logique) s’il vous affiche une valeur? int * mallocIntMaison(int valeur); int main() { int *i; i = mallocIntMaison(10); cout << *i; return 0; } int* mallocIntMaison(int valeur) { int i = valeur; return &i; }
Test#3 a- Il y aura erreur de compilation b- Il y aura un accès à une zone mémoire indéterminée ou invalide c- Le code s'exécutera sans erreur int x[5];Réponse (a, b ou c) : ___ int y[6]; int *z[2]; z[0] = x; z[1] = y;
int main() { int x[5]; int y[6]; int *z[2]; z[0] = x; z[1] = y; (*z)[2]=4; (*(z+1))[3]=8; return 0; } Test #4
Test#5 int x[10];Réponse (a, b ou c) : ___ *(x + 5*sizeof(int)) = 33; a- Il y aura erreur de compilation b- Il y aura un accès à une zone mémoire indéterminée ou invalide c- Le code s'exécutera sans erreur
int main() { int R,x,*y,**z,***w; x = 5; y = &x; z = &y; w = &z; R = ***w; cout << R; return 0; } Test#6
int main() { int a, **c; c = (int **)&a; **c = 5; cout << **c; return 0; } Retour sur le test#1
int main() { int a, **c; c = (int **)&a; (int)*c = 5; cout (*c) return 0; } Test#8
int main() { int R,x,*y,**z,***w; x = 5; y = &x; z = (int **)y; // z = static_cast (y) w = &z; R = (int) **w; // R = static_cast (**w) cout << R; return 0; } Test#9
int main() { int R,x[5],i; for(i=0;i<5;i++) { x[i]=i; } R = *((&(x[3]))+1); cout << R; return 0; } Test #10
int main() { int R,x[5],i,*y[5]; for(i=0;i<5;i++) { x[i]=i; } for(i=0;i<5;i++) { y[i] = &(x[i]); } R = ((&y[0])[1])[2]; cout << R; return 0; } Test #11
Test #12 Réponse (a, b ou c) : ___ long double * ld;Réponse (a, b ou c) : ___ ld = new (long double *); *ld= ; a- Il y aura erreur de compilation b- Il y aura un accès à une zone mémoire indéterminée ou invalide c- Le code s'exécutera sans erreur
Test #13 Qu'est-ce que le programme suivant affiche ? Sinon, expliquez pourquoi que ça plante. int main() { int *tableau, taille = 20, i; for(i=0;i<taille;i++) tableau[i] = i; cout << tableau[12]; return 0; }
Test #14 Donnez la valeur affectée à R suite aux instructions suivantes: int R,z[5],*x,i; x = z; for(i=0;i<5;i++) x[i]=i; x = x+x[1]; x = x- x[2]; x = x+ x[6]; R = *((&(x[-1]))-1);
Test #15 void toto(char ***); int main() { char * ptr1; char ** ptr2; ptr1 = (char *)malloc(128); strcpy(ptr1, "Le C est facile!!!"); ptr2=&ptr1; toto(&ptr2); cout << ptr1; return(0); } void toto (char ***x) { **x = **x + 3; *(**x+1) = '\''; } Qu’affiche ce programme?
Test #16 Considérer le code suivant : int tab[100]; int i=0; int *a; int *b; for(i=0; i<50 ; i++)tab[i] = 10*i; b = new int[100]; a = b; /* ligne 1*/ b = tab; /* ligne 2*/ a) que devient a si on fait free (b) à la place du commentaire /*ligne 1*/ ? b) qu’arrivera –t-il si on fait free (b) à la place du commentaire /*ligne 2*/ ?
Test #17 Écrire une fonction qui initialise une chaîne de char.. void toto1(…); Écrire un main() pour simuler l’appel de toto1()
Test #18 Même question: un tableau de 3 chaînes de char.. void toto2(…); Écrire un main() pour simuler l’appel de toto2()
#include using namespace std; void toto1 (char **x) { *x = new char[40]; strcpy(*x, "salut"); } int main() { char * ptr1; char ** ptr2; toto1(&ptr1); cout << ptr1; toto2(&ptr2); cout << ptr2[0] << ptr2[1] << ptr2[2]) << endl; return 0; } void toto2 (char ***x) { *x = new char *[3]; **x = new char[40]; *(*x+1) = new char[40]; *(*x+2) = new char[40]; strcpy((*x)[0], "allo"); strcpy((*x)[1], "patate"); strcpy((*x)[2], "toto"); }
void mallocIntMaison(int **ptr, int valeur); int main() { int *i; mallocIntMaison(&i,10); cout << *i; return 0; } void mallocIntMaison(int **ptr, int valeur) { int i = valeur; *ptr = &i; } Test #19
Test #20 int main() { int bonjour[50]; int *allo; int i; for(i=0;i<50;i++) bonjour[i] = i; allo = bonjour; allo++; cout << allo[45] <<endl; /*Premier affichage*/ allo[4] = 777; allo[5] = 888; allo[6] = 999; cout << (bonjour+1)[5] <<endl; /*Deuxième affichage*/ allo= allo+10 ; cout <<* (int**) (bonjour - 1) << endl;/*Troisième affichage*/ cout << allo <<endl; /*Quatrième affichage*/ cout << *(int*)(*(bonjour - 1))<< endl; /*Cinquième affichage*/ return 0; } Expliquez tous les affichages après l’exécution de ce code.
Test #21 Qu’affiche le bout de programme suivant : int main() {int **x; int i, j; x=new int*[6]; x[0][0]=0; x[0][1]=1; x[0][2]=2; x[1][0]=3; x[1][1]=4; x[1][2]=5; for (i=0; i<2; i++) for (j=0; j<3; j++) cout << x[i][j]; return 0; }
Test #22 Qu’affiche le bout de programme suivant : int main() {int **x; int i, j; x= new int*[6]; for (i=0; i<6; i++) x[i]= new int; x[0][0]=0; x[0][1]=1; x[0][2]=2; x[1][0]=3; x[1][1]=4; x[1][2]=5; for (i=0; i<2; i++) for (j=0; j<3; j++) cout << x[i][j]; return 0; }
Test #23 Est ce que le programme suivant s’exécute? int main() {int **x; int i, j; x= new int*[6]; for (i=0; i<6; i++) x[i]= new int; x[0][0]=0; x[0][1]=1; x[0][2]=2; x[1][0]=3; x[1][1]=4; x[1][2]=5; for (i=0; i<2; i++) for (j=0; j<3; j++) cout x[i][j]; delete[] x; return 0; }
Test #24 Est ce que le programme suivant s’exécute? int main() {int **x; int i, j; x= new int*[2]; for (i=0; i<2; i++) x[i]= new int[3]; x[0][0]=0; x[0][1]=1; x[0][2]=2; x[1][0]=3; x[1][1]=4; x[1][2]=5; for (i=0; i<2; i++) for (j=0; j<3; j++) cout << x[i][j]; delete [] x; /*Est ce qu’on a rien oublié?*/ return 0; }
Test #25 Qu’affiche le bout de programme suivant : int main() {int ***ptr; int i,j; ptr = new int **[2]; for(i = 0; i < 2; i++) {*(ptr + i) = new int*[3]; for(j = 0; j < 3; j++) {*( *(ptr + i) + j) = new int[4]; *( *( *(ptr + i) + j)) = 48; *( *( *(ptr + i) + j) + 1) = 34; *( *( *(ptr + i) + j) + 2) = 7; *( *( *(ptr + i) + j) + 3) = 125; } cout << ptr[0][1][2]; return 0; }
Test #26 Que fait la fonction sss ci-dessous ? (Test à faire après l’étude de La semaine 3) struct element { TypeEl el; element *suivant; element *precedent; } ;/*noeud typique d’une liste doublement chaînée circulaire */ bool sss(elem *a) { elem *x; if (a == 0) return true; x = a; do { if (a->suivant->precedent != a) return false; a = a->suivant; } while (a != x); return true; }
Test #27 Que fait la fonction sss ci-dessous ? (Test à faire après l’étude de la semaine 3) struct element { TypeEl el; element *suivant; element *precedent; }; /* noeud typique d’une liste doublement chaînée circulaire */ bool sss(elem *a) { elem *x; if (a == 0) return true; x = a; do { if (a->suivant->precedent != a->suivant ) return false; a = a->suivant; } while (a != x); return true; }
Test #28 Soit les déclarations suivantes : int tableau[] = {15,12,14,17,25,89,74,14,1,35,26,85}; int * ptr; int * * ptrPtr; ptrPtr = &ptr; ptr = tableau; Donnez 6 façons différentes (2 qui utilisent ptr et 4 qui utilisent ptrPtr) pour avoir accès à la valeur 89.
int main() {int tableau[] = {15,12,14,17,25,89,74,14,1,35,26,85}; int * ptr; int * * ptrPtr; ptrPtr = &ptr; ptr = tableau; cout << *(ptr+5) << ptr[5] << endl; cout << *(*ptrPtr+5) << ptrPtr[0][5] << (*ptrPtr)[5] << *(ptrPtr[0]+5) << endl;; return 0; }
#include void toto(char ***); int main() { char * ptr1; char ** ptr2; ptr2=&ptr1; toto(&ptr2); cout << ptr1; return 0; } void toto (char ***x) { **x="Bonjour"; *(**x+3)='\0'; } void toto (char ***x) { **x= new char[128]; strcpy(**x, "Bonjour"); *(**x+3)='\0'; } Qu’affiche ce programme? Expliquez. Test #29
Qu’affiche ce programme? Expliquez. Test #30 #include #define N 9 int main() { int *p; char *n; char **s; int tab[N] = {-8,-6,-4,-2,0,2,4,6,8}; s = &n; *s = "pointeurs"; p = tab+N-1; while (**s != '\0') { cout << *(n+*p); ++(*s); p--; } return 0; }
Qu’affiche ce programme? Expliquez. Test #31 int initcmp(char *c1,char *c2) { return c1==NULL || c2==NULL || *c1!=*c2; } void resultat(int (*f)(char*,char*),char *ch1,char *ch2) { if ((*f)(ch1,ch2)==0 ) cout << " pareil\n" else cout << "pas pareil\n"); } int main() { resultat(initcmp,"Anne","Arbre"); resultat(strcmp,"Anne","Arbre"); return 0; }