Sunteți pe pagina 1din 5

Elemente de baz ale programrii n C - Aplicaii de Laborator

Laborator nr. 6
Pointeri
6.1.

Pointeri

Pointerii sunt variabile care conin adrese de memorie. Adresa reprezint locaia unui alt
obiect din memorie, de cele mai multe ori, o alta variabila. Variabilele pointer se declara n mod
similar, dar n plus se folosete simbolul asterisc, *.

Operatorul * se folosete pentru a dereferenia valoarea de la adresa indicat de


pointer, iar operatorul complementar &, pentru a reda (referenia) adresa de memorie a
unei variabile.

6.2.

Probleme

Problema 6.1.
// program nr 1 de verificare a egaliti a doua iruri
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
void verifica (char *a, char *b,
int (*cmp) (constchar *, constchar *));
int compnum(constchar *a, constchar *b);
void main(void)
{
char s1[80], s2[80];
gets(s1);
gets(s2);
if(isalpha(*s1))
verifica(s1, s2, strcmp);
else
verifica(s1, s2, compnum);
}
void verifica(char *a, char *b, int (*cmp)(constchar *, constchar *))
{
printf("verificarea egalitatii\n");
if(!(*cmp)(a,b))printf("sunt egali");
else printf("Nu sunt egali");
}
compnum(constchar *a,constchar *b)
{
51
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

if (atoi(a)==atoi(b)) return 0;
else return 1;
}
Problema 6.2.
// program nr 2 de verificare a egaliti a doua iruri
#include<stdio.h>
#include<string.h>
void verifica(char *a,char *b,int(*cmp) (constchar*,constchar*));
void main(void)
{
char s1[80], s2[80];
int(*p) ();
p=strcmp;
gets(s1);
gets(s2);
verifica(s1,s2,p);
}
void verifica(char *a, char *b,int(*cmp)(constchar*,constchar*))
{
printf("verificarea egalitatii\n");
if(!(*cmp)(a,b)) printf("sunt egali");
else printf("nu sunt egali");
}
Problema 6.3.

# include <stdio.h>
void main(void)
{
int a, *b, c;
a = 12;
b = &a;
*b = 73;
printf(valoarea lui a = %d\n, a);
c = *b;
a = a + c;
printf(valoarea lui a = %d\n, a);
printf(valoarea de la adresa indicata de b s-a schimbat = %d\n,
*b);
*b = c;
printf(valoarea lui a = %d\n, a);
}

52
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

6.3.

Pointer i tablouri

O alt metod de a opera cu tablourile de date este i utilizarea pointerilor n locul


indexri. ntru-ct prin numele unui tablou se definete adresa ctre primul element al tabloului
nu se poate spune ca tabloul este pointer, ci mai degrab c numele unui tablou trebuie
considerat ca fiind un pointer constant. Ca atare atribuia de forma p=a este corect pentru c
pointerul p va pointape elementul a, iar o atribuie de forma a=p este incorect p devine un
pointer constant.
Varianta prelucrri datelor cu pointeri ofer avantajul alocrii stricte a unui numr de
componente.

6.4.

Exemple de probleme

Problema 6.4.
//
#include <stdio.h>
void main(void)
{
int t[] = { 45, 67, 89 };
int *p;
p = t;
printf(" first element: %i\n", *(p++));
printf("second element: %i\n", *(p++));
printf(" third element: %i\n", *p);
}
Problema 6.5.
//Programul urmtor calculeaz i afieaz suma elementelor ntregi ale unui vector de
dimensiune n .
#include <stdio.h>
#include <conio.h>
void main()
{
int a[100],i,n;
printf("\n Introduceti numarul de elemente al vectorului");
scanf("%d%",&n);
printf("\n Introduceti elementele vectorului:");
for (i=0;i<n;i++)
{
printf("\na[%d]=",i);
scanf("%d",a+i);
}
int s=0;
for (i=0;i<n;i++)
53
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

s=s+*(a+i);
printf("\n Suma elementelor vectorului a este: %d",s);
getch();
}

6.5.

Operaii cu pointeri

Cu pointeri se pot efectua urmtoarele tipuri de operaii:


a)
b)
c)
d)

6.6.

Incrementare i decrementare
Adunarea i scderea unui ntreg dintr-un pointer
Compararea a doi pointeri
Diferena a doi pointeri

Exemplu de problem

Problema 6.5.
//Se dorete afiarea notelor studenilor, determinarea mediei grupei la laborator i
numrarea a cte note peste 8 exist.
#include <conio.h>
#include <stdio.h>
#include <alloc.h>
int N, *Note; //se declar pointerul folosit la stocarea datelor
void Citire (void)
{
int I;
printf("\n Dati numarul de studenti");
scanf("%d",&N);
Note = (int *) malloc (N * sizeof(int)); //se aloca memorie pentru cele n
note
for (I=0; I<N ; I++)
{
printf("\n Dati nota studentului %d",I+1);
scanf("%d", Note+I);
}
}
void Afisare(int *Note, int N)
{
int I;
for (I=0; I<N ; I++)
printf("\t%d",*(Note+I) );
printf("\n");
}
float Media(int *Note, int N)
54
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

{
float Med=0;
int I;
for (I=0; I<N ; I++)
Med += *(Note+I);
return Med/N;
}
int Numar (int *Note, int N)
{
int I, Nr;
Nr=0;
for (I=0; I<N ; I++)
if (*(Note+I)>=8) Nr++;
return Nr;
}
void main()
{
Citire();
Afisare(Note, N);
printf("\n Media notelor este %5.2f", Media(Note, N));
printf("\n Numarul notelor peste 8 este %d", Numar(Note, N));
getch();
}

6.7.
6.7.1.
6.7.2.
6.7.3.
6.7.4.
6.7.5.
6.7.6.

Probleme

Ce reprezint un pointer?
Cum se definete un pointer?
Care este diferena dintre un pointer i un tablou?
Care sunt operaiile fcute cu pointeri?
Scriei un program care s utilizeze pointeri n definirea tablourilor de variabile.
Scriei cte un program n care s se fac operaii cu pointeri.

55
MatrixRom 2013

ISBN: 978-973-755-897-8

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