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