Sunteți pe pagina 1din 5

7.

Fie declaraţia : int a[10][10];


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);

S-ar putea să vă placă și