Sunteți pe pagina 1din 59

Programare Programare n limbajul C n limbajul C

www.trainingmasters.ro
www.trainingmasters.ro
Pointeri Pointeri
Memoria poate fi considerat un ir lung
de bytes, fiecare identificat de o adres.
Adresa este numrul de ordine al byte-ului
respectiv.
Structura liniar Structura liniar a memoriei a memoriei
0x0000 ...
...
...
...
...
0x0001
0x000
0x000!
0x000"
www.trainingmasters.ro
respectiv.
#rice opera$ie de scriere%citire din
memorie implic&
specificarea adresei din memorie
scrierea%citirea efectiv a datelor de la
loca$ia specificat de adres
...
...
...
...
...
...
...
0x000"
0x000'
0x000(
0x0!)*
0x0!)+
0x0!),
0x0!))
... ... ...
)iecare variabil este alocat -n memorie
la o adres bine determinat.
*ompilatorul re.erv de la adresa
respectiv at/$ia bytes c/$i sunt
Alocarea variabilelor Alocarea variabilelor
...
...
...
0x0!A
0x0!A!
0x0!A"
www.trainingmasters.ro
respectiv at/$ia bytes c/$i sunt
necesari pentru repre.entarea variabilei
long int x; /* at 0x03A4 */
unsigned char y; /* at 0x03A8 */
...
...
...
...
...
0x0!A"
0x0!A'
0x0!A(
0x0!A0
0x0!A1
x
yy
long int x; /* at 0x03A4 */
unsigned char y; /* at 0x03A8 */
y = 10;
x = y;
Operaii cu variabile Operaii cu variabile
...
...
...
0x0!A
0x0!A!
0x0!A"
www.trainingmasters.ro
mov 03A8h, 10
mov AX, 03A8h
mov 03A4h, AX
#rice opera$ie cu variabile este de
fapt o opera$ie asupra loca$iilor
de memorie alocate variabilelor
...
...
...
...
...
0x0!A"
0x0!A'
0x0!A(
0x0!A0
0x0!A1
x
yy
long int x; /* at 0x03A4 */
unsigned char y; /* at 0x03A8 */
Adresa unei variabile 2sau func$ii3 se
poate afla folosind operatorul &
Adresa variabilelor Adresa variabilelor
...
...
...
0x0!A
0x0!A!
0x0!A"
www.trainingmasters.ro
poate afla folosind operatorul &
printf(adresa lui x este %X\n, &x);
printf(adresa lui y este %X\n, &y);
...
...
...
...
...
0x0!A"
0x0!A'
0x0!A(
0x0!A0
0x0!A1
x
yy
adresa lui x este !A"
adresa lui y este !A1
1. 4n pointer este o variabil.
o loca$ie de memorie care con$ine o valoare
. 5aloarea con$inut de pointer este o adres
Pointeri Pointeri
www.trainingmasters.ro
. 5aloarea con$inut de pointer este o adres
adresa unei alte variabile, etc.
valoarea practic 6indic7 spre o alt variabil 2de
unde denumirea de pointer3
1. 4n pointer este o
variabil.
. 5aloarea con$inut de
Pointeri Pointeri
... 0x0!A
0x0!A"
0x0!8A
www.trainingmasters.ro
. 5aloarea con$inut de
pointer este o adres
...
...
...
...
...
...
...
0x0!A
0x0!A!
0x0!A"
0x0!A'
0x0!A(
0x0!A0
0x0!A1
x
+eclararea unui pointer 2sintax3&
<modificatori> tip_pointat *nume_pointer;
9e indic tipul de variabil spre care va pointa
pointerul:
Pointeri Pointeri - - declarare declarare
www.trainingmasters.ro
pointerul:
tip_pointat poate fi orice tip predefinit, sau definit de
utili.ator.
este permis inclusiv un pointer spre void
,xemple&
unsigned long int *ptr_km;
signed int *ptr_viteza;
void *ptr_generic;
Pointeri Pointeri - - declarare declarare
www.trainingmasters.ro
typedef unsigned char t_byte;
t_byte *ptr_byte;
typedef struct {
float rotatia;
int viteza;
} st_coord;
st_coord *pt_coord;
Pointeri Pointeri alocarea memoriei alocarea memoriei
0x0!A"
0x0(;1
pt!coord
pt!byte
www.trainingmasters.ro
unsigned char *pt_byte;
long int *pt_lgint;
<ndiferent de tipul spre care pointea.,
unui pointer i se aloc at/ta
memorie c/t e necesar pentru
stocarea unei adrese.
0x0"(A pt!lgint
<ni$iali.are&
operatorul adres &
int i;
int *ptr_int;
Operaii cu pointeri Operaii cu pointeri
www.trainingmasters.ro
ptr_int = &i;
+ereferen$iere&
operatorul " 26valoarea de la adresa pointat73
int i = 5;
int *ptr_int = &i;
int j = *ptr_int; /* i = 5 */
www.trainingmasters.ro
#xerci #xerciiul $% iul $%
#pera$iile aritmetice legale cu pointeri&
incrementare%decrementare
adunarea%scderea unui -ntreg la un pointer
scderea unui pointer dintr-un alt pointer
Operaii aritmetice Operaii aritmetice
www.trainingmasters.ro
scderea unui pointer dintr-un alt pointer
compararea a doi pointeri
int x,y,z;
int *ptr_int = &x; /*0x03A2*/
ptr_int++; /* 0x03A4 ! */
Operaii aritmetice Operaii aritmetice
... 0x0!A
&ncrementarea'decrementarea unui pointer(
www.trainingmasters.ro
ptr_int++; /* 0x03A6 ! */
ptr_int--; /* 0x03A4 ! */
<ncrementarea%decrementarea are
sens doar pentru o secven$ de
date de acelai tip 2tablou3.
...
...
...
...
...
...
...
0x0!A
0x0!A!
0x0!A"
0x0!A'
0x0!A(
0x0!A0
0x0!A1
x
y
)
Adunarea'scderea unui ntreg la un pointer(
nume_tip *ptr; ptr = ptr + N;
se adun = > dimensiunea tipului pointat
Operaii aritmetice Operaii aritmetice
www.trainingmasters.ro
la fel i pentru scdere
float *ptr1 = (float *)0x370;
int *ptr2;
ptr2 = (int *)(ptr1 + 3); /* 0x370 + 3*4 = 0x37C */
ptr2 -= 5; /* 0x37C - 5*2 = 0x372 */
Scderea unui pointer din alt pointer(
nume_tip *ptr1, *ptr2; N = ptr2 ptr1;
re.ultatul este numrul de elemente de tipul
Operaii aritmetice Operaii aritmetice
www.trainingmasters.ro
re.ultatul este numrul de elemente de tipul
pointat dintre cele dou adrese
= ? 2adresa - adresa13 % dimensiunea tipului
are sens numai c/nd ambii pointeri pointea. spre
elemente ale aceluiai tabel
Scderea unui pointer din alt pointer(
int tabel[5];
int *ptr1 = &tabel[1];
int *ptr2 = &tabel[4];
Operaii aritmetice Operaii aritmetice
www.trainingmasters.ro
int x = ptr2 ptr1; /* x = 3 */
ptr1 ptr
tabel
Compararea a doi pointeri(
nume_tip *ptr1, *ptr2; ptr2 > ptr1;
are sens numai c/nd ambii pointeri pointea. spre
Operaii aritmetice Operaii aritmetice
www.trainingmasters.ro
are sens numai c/nd ambii pointeri pointea. spre
elemente ale aceluiai tabel
se poate afla dac&
pointerii indic spre acelai element
elementul indicat de un pointer precede elementul
indicat de cellalt pointer
www.trainingmasters.ro
#xerciiul $* #xerciiul $*
)unc$iile pot primi ca parametri pointeri.
antet& int func(int *a, int *b);
utili.are -n func$ie&
Pointeri +i ,uncii Pointeri +i ,uncii
www.trainingmasters.ro
int func(int *a, int *b) {
if (*a > *b) ...
}
apelul ctre func$ie&
$-
int x,y;
func(&x, &y);
%-
int *ptr1, *ptr2;
func(ptr1, ptr2);
*/nd definim func$ii cu parametri pointeri@
c/nd vrem ca modificrile din func$ie s fie vi.ibile
i afar din func$ie
Pointeri +i ,uncii Pointeri +i ,uncii
void main (void) { void main (void) {
www.trainingmasters.ro
void main (void) {
int x = 3;
func(x);
printf(x=%d\n); /* 3 */
}
void func (int i) {
i = 5;
}
void main (void) {
int x = 3;
func(&x);
printf(x=%d\n); /* 5 */
}
void func (int *i) {
*i = 5;
}
*/nd definim func$ii cu parametri pointeri@
c/nd parametri transmii au dimensiune foarte
mare, pentru a nu -ncrca stiva
Pointeri +i ,uncii Pointeri +i ,uncii
www.trainingmasters.ro
typedef struct {
double x;
double y;
} t_coord;
void func1(t_coord st);
void func2(t_coord *ptr_st);
parametrul ctre func1 va
-ncrca stiva cu 1( bytes
parametrul ctre func va
-ncrca stiva cu -" bytes
2dimensiunea adresei3
)unc$iile pot returna pointeri.
antet& int* func(int a);
utili.are -n func$ie&
int* func(int a) {
Pointeri +i ,uncii Pointeri +i ,uncii
www.trainingmasters.ro
int* func(int a) {
return &tabel[a];
}
apelul ctre func$ie&
int x,*y;
y = func(5);
x = *y;
int* func(int a) {
int b = 3;
b *= a;
return &b;
}
Pointeri +i ,uncii Pointeri +i ,uncii
www.trainingmasters.ro
nu returna$i niciodat pointeri ctre variabile
locale 2automatice3
la ieirea din func$ie, pointerul returnat va pointa
spre o variabil ce nu mai exist:
www.trainingmasters.ro
#xerciiul $. #xerciiul $.
/ablou 2array3& o -niruire finit de elemente de
acelai tip.
+eclarare&
/ablouri de date /ablouri de date
www.trainingmasters.ro
+eclarare& nume_tip nume_tablou[dimensiune];
nume_tip& orice tip predefinit sau definit de utili.ator
dimensiune& numr -ntreg
,xemple&
unsigned char nr_de_concurs[10]; /* 10 bytes */
float frecv_salvate[6]; /* 24 bytes */
t_coord pozitii_anterioare[3]; /* 48 bytes */
/ablouri de date /ablouri de date
www.trainingmasters.ro
Alocarea memoriei&
se re.erv spa$iul necesar tuturor elementelor
tabloului
.ona de memorie re.ervat este continu
Accesarea elementelor&
int tablou[8] = {3,7,3,4,1,9,5,2};
int x = tablou[2]; /* x = 3 */
/ablouri de date /ablouri de date
www.trainingmasters.ro
tablou[1] = tablou[7]; /* 3,2,3,4,1,9,5,2 */
nu se face verificarea indexului:
tablou[10] e o construc$ie legal
Aarcurgerea tablourilor&
se face de obicei cu bucle for
buclele pot fi -ntrerupte cu break
/ablouri de date /ablouri de date
www.trainingmasters.ro
9cop&
calcule asupra fiecrui element
cutarea unui element ce corespunde condi$iilor
Bablouri multidimensionale&
nume_tip nume_tablou[dim1][dim2][dim3]...;
,xemplu&
/ablouri de date /ablouri de date
0 1 tbC0D
www.trainingmasters.ro
,xemplu&
int tb[2][3];
Eayout -n memorie&
tbC0DC0D tbC0DC1D tbC0DCD tbC1DC0D tbC1DC1D tbC1DCD
tbC0D tbC1D
0 1
0 1
tbC0D
tbC1D
www.trainingmasters.ro
#xerciiul $0 #xerciiul $0
www.trainingmasters.ro
Structuri +i uniuni Structuri +i uniuni
Structura este un tip de date definit de utili.ator, care
-ncapsulea. un numr de variabile diverse.
Fol&
Structuri Structuri
www.trainingmasters.ro
Fol&
agregarea datelor ce apar$in aceluiai 6obiect7
construirea tipurilor complexe de date
uurin$a compunerii tipurilor
reutili.are
+eclarare&
struct <nume_struct> {
<definitie_date>;
...
<definitie_date>;
Structuri Structuri
www.trainingmasters.ro
<definitie_date>;
} <lista_var>;
nume_struct: identificatorul structuriiG poate fi omis, de obicei
c/nd declararea variabilelor urmea. la finalul declara$iei
lista_var: op$ional, se pot declara variabile de tipul structurii
imediat la final
struct cub {
int latura;
int culoare;
};
struct tablou_alt {
unsigned char lungime;
int *primul_elem;
};
Structuri Structuri
,xemple&
www.trainingmasters.ro
struct cub c1, c2;
void draw(struct cub c);
struct apart {
int suprafata;
int camere;
} a1, a2;
struct carte {
unsigned long nr_inreg;
unsigned int nr_pagini;
unsigned long data_return;
unsigned char stare;
};
+eclararea unui tip structur&
facilitea. utili.area ulterioar a tipului
typedef struct {
int latura;
Structuri Structuri
www.trainingmasters.ro
int latura;
int culoare;
} t_cub;
t_cub c1, c2, c3;
void draw(t_cub c);
<ni$iali.are&
la declarare&
struct coord {
int x;
Structuri Structuri
www.trainingmasters.ro
int x;
int y;
float viteza;
}
struct coord poz_auto1 = {15, 37, 28.9};
dup declarare, acces/nd individual fiecare
membru
Alocarea memoriei&
se aloc membrii structurii -n ordine
se $ine cont de particularit$ile compilrii
Structuri Structuri
www.trainingmasters.ro
struct linie {
unsigned char culoare;
int lungime;
} lin1;
culoare
lungime
culoare
lungime
fr aliniere aliniere la adres par
0x100
0x101
0x10
0x100
0x101
0x10
0x10!
#pera$ii permise&
copiere ca tot unitar
accesarea membrilor
adresa variabilei tip structur
Structuri Structuri
www.trainingmasters.ro
adresa variabilei tip structur
*opiere ca tot unitar&
doar -ntre structuri de acelai tip
typedef struct {
unsigned char culoare;
Structuri Structuri
www.trainingmasters.ro
unsigned char culoare;
int lungime;
} t_linie;
t_linie linie1 = { RED, 7 };
t_linie linie2;
linie2 = linie1; /* linie2 = { RED, 7 } */
Accesarea membrilor&
se reali.ea. cu operatorul H - I
typedef struct {
unsigned char culoare;
Structuri Structuri
www.trainingmasters.ro
unsigned char culoare;
int lungime;
} t_linie;
void draw_line(int);
t_linie linie1;
linie1.culoare = GREEN;
draw_line(linie1.lungime);
Adresa unei variabile tip structur&
se ia cu operatorul adres &
membrii se pot accesa via pointer cu operatorul -1
Structuri Structuri
www.trainingmasters.ro
typedef struct {
unsigned char culoare;
int lungime;
} t_linie;
t_linie linie1 = { RED, 7 };
t_linie* ptr_linie = &linie1;
ptr_linie->culoare = BLUE; /* linie1 = { BLUE, 7 }*/
www.trainingmasters.ro
#xerciiul $2 #xerciiul $2
*ompunerea structurilor&
typedef struct {
int x, y;
} coord;
typedef struct {
Structuri Structuri
www.trainingmasters.ro
typedef struct {
int vit_x;
int vit_y;
} dinamica;
typedef struct {
coord pozitie;
dinamica miscare;
} masina;
masina m = { {3,5}, {17,6} };
m.pozitie.y = 8;
9tructuri compuse&
nu pot avea membri de tipul aceleai structuri
2recursie3
pot avea membri pointer la aceeai structur
Structuri Structuri
www.trainingmasters.ro
pot avea membri pointer la aceeai structur
util -n ca.ul construc$iei listelor -nln$uite
struct elem {
int valoare;
struct elem *next;
};
' ! 8
Bablouri de structuri&
struct linie {
unsigned char culoare;
int lungime;
};
Structuri Structuri
se adaug 1 byte
nefolosit la finalul
fiecrui element, pentru
www.trainingmasters.ro
};
struct linie tab_linii[10];
tab_linii[2].culoare = RED;
c lung c lung c lung c lung
tabJliniiC0D tabJliniiC1D tabJliniiCD tabJliniiC!D
fiecrui element, pentru
ca urmtoarea structur
s -nceap la adres par
3niunea este un tip de date definit de utili.ator, care
-ncapsulea. un numr de membri diveri, to$i
-mpr$ind acelai spa$iu de memorie.
3niuni 3niuni
www.trainingmasters.ro
Fol&
agregarea modurilor diferite de accesare ale aceluiai
6obiect7
+eclarare&
union <nume_uniune> {
<definitie_date>;
...
<definitie_date>;
3niuni 3niuni
www.trainingmasters.ro
<definitie_date>;
} <lista_var>;
nume_uniune: identificatorul uniuniiG poate fi omis, de obicei
c/nd declararea variabilelor urmea. la finalul declara$iei
lista_var: op$ional, se pot declara variabile de tipul uniunii
imediat la final
union word {
unsigned char b[2];
unsigned int w;
};
typedef union {
long int dWord;
struct {
short int dwMSB;
short int dwLSB;
3niuni 3niuni
,xemple&
www.trainingmasters.ro
union word w1;
w1.w = 0x6402;
if (w1.b[1]==0x64)...
short int dwLSB;
} w;
struct {
unsigned char byMSB;
unsigned char byMSBL;
unsigned char byLSBH;
unsigned char byLSB;
} b;
} u_Dword;
Alocarea memoriei&
to$i membrii sunt aloca$i -ncep/nd cu aceeai
adres
dimensiunea uniunii e dimensiunea celui mai
3niuni 3niuni
www.trainingmasters.ro
dimensiunea uniunii e dimensiunea celui mai
mare membru
union U {
unsigned char b;
short int w;
long int l;
}
b
4
0x100
0x101
0x10
0x10!
l
typedef union {
long int dWord;
struct {
short int dwMSB;
short int dwLSB;
3niuni 3niuni
Alocarea memoriei&
b-by5
4-d46S7
0x100
www.trainingmasters.ro
short int dwLSB;
} w;
struct {
unsigned char by0;
unsigned char by1;
unsigned char by2;
unsigned char by3;
} b;
} u_Dword;
4-d46S7
0x101
0x10
0x10!
d8ord
4-d49S7
b-by$
b-by%
b-by*
www.trainingmasters.ro
#xerciiul $: #xerciiul $:
C;mpul de bii este un tip special de date ce poate fi
definit doar -n cadrul unei structuri, ca membru.
Fol&
C;mpuri de bii C;mpuri de bii
www.trainingmasters.ro
Fol&
specificarea precis a dimensiunii -n bi$i a fiecrui membru
definirea de membri de dimensiuni mici, sau de
dimensiuni ce nu sunt multiplu de 1 bi$i
-mpacKetarea -ntr-un singur byte a mai multor membri
+eclarare&
struct <nume_struct> {
nume_tip nume_membru : NR_BII;
...
nume_tip nume_membru : NR_BII;
C;mpuri de bii C;mpuri de bii
www.trainingmasters.ro
nume_tip nume_membru : NR_BII;
} <lista_var>;
nume_tip: tipul membrului L un tip -ntreg, cu sau fr semn
se recomand tipuri fr semn
NR_BII: numrul de bi$i care vor fi aloca$i membrului
struct hdd_ctrl {
unsigned ready:1;
unsigned error_occured:1;
unsigned disk_spinning:1;
C;mpuri de bii C;mpuri de bii
,xemple&
www.trainingmasters.ro
unsigned write_protect:1;
unsigned head_loaded:1;
unsigned error_code:8;
unsigned track:9;
unsigned sector:5;
unsigned command:5;
}
tracM errJcode *M+ sector
KeadJloaded
writeJprotect
disMJspinning
errorJoccured
ready
typedef union {
unsigned char b;
struct {
unsigned b0:1;
byte message_status;
message_status.b = 0xFF;
C;mpuri de bii C;mpuri de bii
,xemple&
www.trainingmasters.ro
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
} bit;
} byte;
message_status.bit.b3 = 1;
9unt utili.ate u.ual la&
descrierea registrelor de control%stare a
perifericelor
descrierea con$inutului telegramelor din diverse
C;mpuri de bii C;mpuri de bii
www.trainingmasters.ro
descrierea con$inutului telegramelor din diverse
tipuri de transmisii seriale 2ex. *A=3
descrierea colec$iilor de statusuri bitwise
www.trainingmasters.ro
#xerciiul $< #xerciiul $<

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