structures de données ift-10541 abder alikacem semaine 2 tests sur les pointeurs département...
TRANSCRIPT
Structures de donnéesIFT-10541
Abder AlikacemAbder Alikacem
Semaine 2Tests sur les pointeurs
Département d’informatique et de génie logiciel
Édition Janvier 2009
! +
Test#1
a- Il y aura erreur de compilationb- Il y aura un accès à une zone mémoire indéterminée ou
invalidec- 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 compilationb- Il y aura un accès à une zone mémoire indéterminée ou
invalidec- 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 compilationb- Il y aura un accès à une zone mémoire indéterminée ou
invalidec- 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 << (int) *c; // cout << static_cast<int>(*c)
return 0;}
Test#8
int main(){int R,x,*y,**z,***w;
x = 5;y = &x;z = (int **)y; // z = static_cast<int**>(y)w = &z;R = (int) **w; // R = static_cast<int>(**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= 593280.112358;
a- Il y aura erreur de compilationb- Il y aura un accès à une zone mémoire indéterminée ou
invalidec- 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 #16Considé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 <iostream>#include <cstring>
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 affichagesaprès l’exécution de ce code.
Test #21Qu’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 #22Qu’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 #23Est 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 #24Est 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 #25Qu’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 deLa 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 #28Soit 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 <cstring>
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 <stdio.h>#define N 9int 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 #31int 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;}