Sunteți pe pagina 1din 5

Exerciţii şi teste grilă cu pointeri 7.

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


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

42. Fie secvenţa :


int t[5]={20,30,40,50,10};
int *p; int x;

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