Exerciţii şi teste grilă cu pointeri Care din expresiile următoare sunt echivalente? a) *a[i] b) **(a+i) c) *(*a+i) d) a[0][i] 1. Fie declaraţia: int var,*pointer;. e) a[i][0] Verificaţi dacă expresia: (&pointer) are aceeaşi semnificaţie cu pointer şi &(var) 8. Este corectă secvenţa char*s;gets(s); ? are aceeaşi semnificaţie cu var. Cum explicaţi aceasta ? 9. Explicaţi care din instrucţiuni sunt greşite în secvenţa următoare : 2. Fie declaraţia: double d,*pd;. Să se char *s=”Test C”; decidă dacă variabilele d şi pd au aceeaşi *s=”Ansi C”; dimensiune. s=”Ansi C”;
3. Considerăm declaraţiile : 10. Care dintre următoarele variante reprezintă
int n, const int a=10 , o declaraţie corectă a unei variabile x de tipul *pci=&a; “adresă a unei variabile întregi” ? Să se determine care dintre instrucţiuni sunt a) int x*; b) int *x; corecte : c) int x; d) int &x; n=a; a=2; e) int x&; n=*pci; *pci=1; pci++; 11. Se consideră declaraţia de variabile: int m, *x,*y; 4. Fie declaraţiile : Care dintre următoarele atribuiri sunt corecte ? int n=10; a) x=m; b) *x=*m; const *cpi=&n; c) *y=*x; d) y=&m; Să se determine corectitudinea instrucţiunilor e) y=x; următoare : *cpi=1; cpi=&n; 12. Fie declaraţiile de variabile: cpi++; n=cpi; int a=2,b; int *x,*y; Precizaţi ce valori se vor afişa, în ordine, în 5. Precizaţi ce tipăreşte programul următor : urma execuţiei secvenţei de program de mai jos: #include<stdio.h> x=&a; a=5; printf(“%d”, *x); long a[10]= b=a-2; y=&b; b+=(*y)+4; {10,11,12,13,14,15,16,17, printf(“%d”, b); 18,19}; *y=*x; printf(“%d”, *y); void main() if(x==y) putchar(‘1’); { long *pi; else putchar(‘0’); for(pi=&a[0];pi<&a[10]; a) 2,10,2,1 b) 2,10,2,0 pi++) c) 5,7,5,0 d) 5,10,5,0 printf(“\n%p:%ld”, e) 5,10,5,1 pi, *pi); } 13. Se consideră următoarea secvenţă de program: 6. Precizaţi ce face programul următor: int *q,**p,a=5,b=3; #include<stdio.h> *p=&a; // (1) int a[10]= q=*p; // (2) {10,11,12,13,14,15,16,17, b+=*(&(**p)); // (3) 18,19}; printf(“%d %d”,*q,b); void main() Ce puteţi spune despre atribuirile (1), (2) şi (3)? { int *pi; a) nici una dintre atribuiri nu for(pi=a;pi<a+10;) este corectă printf(“\n%p:%d”,pi, b) numai atribuirea (1) este ++*pi++); corectă } c) numai atribuirile (1) şi (2) sunt corecte d) toate sunt corecte şi secvenţa 18. Fie un pointer x către întreg. Care dintre afişează de două ori numărul 5 instrucţiunile de ma jos realizează corect e) toate atribuirile sunt corecte alocarea dinamică a memoriei ? şi secvenţa afi-şează numerele 5 a) x=(int)malloc(sizeof(int*)); şi 8 b) x=(int*)malloc(sizeof(int*)); c) x=(int*)malloc(sizeof(int)); 14. Fie atribuirea : *y=&(*(&z)); Cum d) *x=(int*)malloc(sizeof(int)); trebuie scrise corect declaraţiile de variabile, e) *x=(int)malloc(sizeof(int*)); astfel încât atribuirea să fie corectă ? a) int *y,z; b) int y,*z; 19. Fie următoarele declaraţii de variabile: c) int y,**z d) int **y,z; int **a,*b,c; e) int **y,*z; Care dintre expresiile de mai jos vor genera eroare la execuţie? 15. Care dintre instrucţiunile (I),(II),(III),(IV) din a) a=&(&c); b) b=&(**a); programul următor sunt eronate? Precizaţi c) *a=&c; d)**a=&b; valorile obţinute în cazul instrucţiunilor corecte. e) *b=**a+c; #include<stdio.h> void main() 20. Considerăm declaraţia: int **p; { şi atribuirea p=&q; Alegeţi varianta potrivită const int x=3; astfel încât atribuirea să aibă sens. int u,v; a) int q; b) int *q; x=4; // (I) c) int ***q; d) int &q; *(int*)&x=8; // (II) e) nici una u=x; // (III) v=*(int*)&x; // (IV) 21. Precizaţi valoarea variabilei a ca urmare a } execuţiei programului următor: a)I b)II c)III d)IV void main() e) nici una { int a; char b=1; 16. Alegeţi atribuirea corectă din programul de a=*(int*)&b; mai jos: } void main() a)1 b)97 c) neprecizată { d) nici una int a; void *p; e) programul este greşit p=(int*)&a; // (I) p=&a; // (II) 22. Precizaţi care dintre instrucţiunile de p=(float*)&a;// (III) atribuire de mai jos face ca x să primească p=&(int*)a; // (IV) valoarea 0: } void main() a)I b)II c)III { d) IV e) nici una int a=1,b=2; float x; x=a/ *&b; // (I) 17. Fie declaraţiile de variabile: x=(float) a/b; // (II) int a=2,b,c=5; } int *x,*y; a)I b)II c) ambele Precizaţi ce valori se vor afişa, în ordine, în d) nici una e) programul este urma execuţiei secvenţei de program de mai gresit jos: x=&c; a+=*x; printf(“%d”,a); 23. Care dintre instrucţiunile de tipărire vor afişa b=++a; y=&b; aceeaşi valoare ? printf(“%d”,*y); #include<stdio.h> x=y; printf(“%d”,(*x)++; void main() a) 7,7,7 b) 7,8,9 { c) 7,8,8 d) 7,7,8 int a=2,*p=&a; e) 8,8,9 printf(“%d\n”,*p+1); printf(“%d\n”,*&p+1); printf(“%d\n”,*(p+1)); printf(“%d\n”,*v[0]);//(2) printf(“%d\n”,*(&p+1)); *(v+1)=&b; //(3) } printf(“%d\n”,*(*(v+1))); //(4) a) prima şi a doua 2[v]=&c; //(5) b) a doua şi a treia printf(“%d\n”,*v[2]);//(6) c) a doua şi a patra } d) nici una a) declaraţia vectorului este e) programul este eronat eronată a) atribuirile (1), (3) şi (5) sunt 24. În programul următor, care dintre cele patru toate corecte instrucţiuni va tipări valoarea 11? b) atribuirea (1) este corectă, iar #include<stdio.h> (3) şi (5) sunt eronate void main() c) atribuirile (1) şi (3) sunt { corecte, iar (5) este eronată const int x=2,y=3; d) programul este corect şi afişează *(int*)&x=8; valorile 5, -12, 7 *(int*)&y=9; printf(„%d\n”,x+y); 27. Ce va afişa programul următor? printf(„%d\n”, #include<stdio.h> *(int*)&x+y; void main() printf(„%d\n”, { x+*(int*)&y; int (*v)[3]; printf(„%d\n”, int u[]={10,11,12}; *(int*)&x+*(int*)&y; v=&u; } printf(“%d”,(*v)[1]; a) prima b) a doua } c) a treia d) a patra a) programul este eronat e) nici una b) o adresă de memorie oarecare, fără nici-o semnificaţie 25. Fie programul următor: c) valoarea întreagă 11 #include<stdio.h> d) adresa de memorie la care se void main() află valoarea întreagă 11 { e) adresa începând cu care se int m[9],i; găseşte vectorul v în memorie for(i=0;i<9;i++) m[i]=i; 28. Se consideră următoarea secvenţă de while(i>0) program: { i--; *(m+i)=-i; } int a[9][11],i,j; } for(i=0;i<9;i++) Care dintre afirmaţiile de mai jos sunt adevărate for(j=0;j<11;j++) ? if(i==j) a) ambele cicluri sunt greşite (*(a+i)) [j]=0; b) numai primul ciclu este corect else *(*(a+i)+j)=i*j; c) numai al doilea ciclu este Precizaţi care dintre afirmaţiile de mai jos sunt corect false: d) ambele cicluri sunt corecte a) a[5][2] este 10 e) în cele două cicluri, elementele b) a[8][0] este 6 vectorului vor primi valori c) *(*(a+3)+3) este 0 egale în modul, dar de semne d) programul conţine erori de opuse sintaxă e) matricea a este simetrică faţă 26. Se consideră programul următor: de diagonala principală #include<stdio.h> void main() 29. Se consideră următoarele declaraţii de { variabile: int a=5,b=-12,c=7,*v[3]; int q=6,d[3][4],(e[3])[4],v[4]; v[0]=&a; //(1) int *a[3][4],(*b)[3][4], (*c[3])[4]; a) programul va afişa patru adrese Care dintre atribuirile de mai jos sunt corecte? de memorie a) d[0][2]=e[1][3]; b) programul va afişa, în ordine, b) a[2][3]=&q; valorile 6,8, 10,12 c) b=&d; d) c[2]=&v; c) valoarea lui (*x)[2] este 3 e) toate atribuirile ante-rioare d) valoarea lui (*y)[4] este 8 e) instrucţiunea de afişare din 30. Precizaţi ce valoare va afişa programul ciclu este eronată, din cauza următor: folosirii operatorului de #include<stdio.h> atribuire în funcţia printf void main() { 33. Fie următorul program: int a[20][20],i,j,n=4; #include<stdio.h> for(i=0;i<n;i++) void main() for(j=0;j<n;j++) { *(*(a+i)+j)=(i>j)? int x[4]={1,2,3}, (j-i) : (j+i); y[4]={4,5,6,7}, int m=10; z[7]; for(i=0;i<n;i++) int i,j; for(j=0;j<n;j++) for(i=0;i<4;i++) if(m>(*(a+i))[j]) *(z+i)=*(y+i); m=a[i][j]; for(j=0;j<3;j++) printf(“%d”,m); *(z+i+j)=*(x+j); } for(i=0;i<7;i++) a) 10 b)6 c) 3 d) –3 printf(“%d”,*(z+i)); e) programul este eronat } Care vor fi valorile afişate în urma execuţiei 31. Fie vectorul y cu patru elemente numere sale? întregi: a) 1,2,3,4,5,6,7 int y[4]={0,1,2,3}; b) 7,6,5,4,3,2,1 Care dintre următoarele instrucţiuni declară şi c) 3,2,1,7,6,5,4 iniţializează corect un pointer ptr către vectorul d) 4,5,6,7,1,2,3 y? e) programul este eronat a) int *(ptr[4])=&y; b) int (ptr*)[4]=&y; 34. Fie secvenţa de instrucţiuni: c) int (*ptr)[4]=&y; int x[]={10,20,30,40,50}; d) int ptr*[4]=&y; int*ptr=x; e) int *ptr[4]=&y; printf(“%d\n”,*(ptr+2)); printf(“%d\n”,*(ptr)+2); 32. Fie următorul program: Ce se va tipări după executarea codului de mai #include<stdio.h> sus? void main() a) 30 30 b) 30 12 { c) 12 12 d) 12 30 int u[4]={1,2,3,4}, v[4]={5,6,7,8}, 35. Fie secvenţa de instrucţiuni: w[4]={0,0,0,0}, i; int *array[3]; int (*x)[4]=&u, int(*ptr)[]=array; (*y)[4]=&v, int x=2,y=3,z=4; (*z)[4]=&w; Având în vedere codul de mai sus, cum veţi for(i=0;i<4;i++) realiza atribuirea celui de al doilea pointer din printf(“%3d”, şirul “ptr” ca să pointeze la valoarea lui y ? (*z)[i]=(*x)[i]+(*y)[i]); a) ptr[2]=&y; } b) (*ptr)[1]=y; Care dintre afirmaţiile de mai jos sunt c) (*ptr)[1]=&y; adevărate? d) (*ptr)[2]=&y; 36. Fie următoarea declaraţie de variabile : c) p=*t; x=*p+3; int *p; int x,y; d) p=t; x=*p+3; Atribuirea y=x+100; este echivalentă cu secvenţa: 43. Fie secvenţa : a) p=&x; y=*p+100; int t[5]={20,30,40,50,10}; b) y=*p+100; p=&x; int *p; int x; c) p=&y; y=*p+100; Atribuirea x=*(&t[0]+3); este echivalentă cu d) p=&x; y=&p+100; : a) x=t[3]; b) x=t[4]; 37. Fie următoarea declaraţie de variabile : c) x=*(&t[2]); d) x=*(t+4); int *p; int x,y; Atribuirea x=y; este echivalentă cu secvenţa : 44. Se consideră secvenţa de program: a) p=&x; *p=y; void main(void) b) p=&y; *p=x; { int *p, *q; c) *p=x; p=&y; p=(int*)malloc d) *p=y; p=&x; (sizeof(int)); q=(int*)malloc 38. Fie următoarea declaraţie de variabile : (sizeof(int)); int *p; int x,y; *p=5; *q=3; *p=*q; Instrucţiunea x++; este echivalentă cu secvenţa if(p==q) *p+=1; : printf(“%d”,*p); a) p=&x; (*p)++; } b) p=*x; (&p)++; Care este valoarea afişată pentru p : c) p=&x; *(p++); a) 5 b) 3 c)6 d)4 d) p=&x; *p++; 45. Se dă următoarea secventă de cod: 39. Fie următoarea declaraţie de variabile : int a[5]={1,2,3,4,5}; int *p; int x,y; int *aPtr; p=&x; aPtr=a; Atribuirea y=x*(x+1); este echivalentă cu printf(“element=%d\n”, secvenţa : *(aPtr+2)); a) y=*p*((*p)++); Ce va afişa codul de mai sus după execuţie ? b) y=*p*(*p++); a) element=1 c) y=*p**p++; b) element=2 d) y=(*p)*(*p++); c) element=3 d) element=4 40. Fie următoarea declaraţie de variabile : int *p; int x=100,y; p=&x; 46. Se dă codul: În urma atribuirii y=*p*((*p)++); y va avea int *ptr; int y[10]; int i; valoarea : a) 10100 b) 11000 for(i=0;i<10;i++) y[i]=i; c) 10001 d) 10000 ptr=y; ptr+=8; printf(“ptr=%d\n”, *ptr); 41. Fie următoarea declaraţie de variabile : Ce se va afişa când codul este executat ? int *p; int x=100, y; p=&x; a) ptr=0 b) ptr=9 c) ptr=7 d) ptr=8 În urma atribuirii y=*p+((*p)++); y va avea valoarea : a) 201 b) 102 c) 200 d) 202
42. Fie secvenţa :
int t[5]={20,30,40,50,10}; int *p; int x; Atribuirea x=t[3]; este echivalentă cu : a) p=t; x=*(p+3); b) p=&t[0]; x=*(p+2);