You are on page 1of 28

B mn Cng ngh phn mm

Khoa Cng ngh thng tin


Trng i hc Khoa hc T nhin

NHP MN LP TRNH
ThS. ng Bnh Phng
dbphuong@fit.hcmus.edu.vn

CHUYN I KIU D LIU


& CP PHT B NH NG

1
&
VC
BB
Ni dung

1 Chuyn i kiu (p kiu)

2 Cu trc CT C trong b nh

3 Cp pht b nh ng

4 Cc thao tc trn khi nh

Qun l b nh
2
&
VC
BB
Nhu cu chuyn i kiu

Mi i tng d liu trong C u c kiu xc


nh
Bin c kiu char, int, float, double,
Con tr tr n kiu char, int, float, double,
X l th no khi gp mt biu thc vi nhiu
kiu khc nhau?
C t ng chuyn i kiu (p kiu).
Ngi s dng t chuyn i kiu.

Qun l b nh
3
&
VC
BB
Chuyn i kiu t ng

S tng cp (kiu d liu) trong biu thc


Cc thnh phn cng kiu
Kt qu l kiu chung
int / int int, float / float float
V d: 2 / 4 0, 2.0 / 4.0 0.5
Cc thnh phn khc kiu
Kt qu l kiu bao qut nht
char < int < long < float < double
float / int float / float,
V d: 2.0 / 4 2.0 / 4.0 0.5
Lu , ch chuyn i tm thi (ni b). 4
Qun l b nh
&
VC
BB
Chuyn i kiu t ng

Php gn <BT v tri> = <BT v phi>;


BT v phi lun c tng cp (hay gim
cp) tm thi cho ging kiu vi BT v tri.
int i;
float f = 1.23;

i = f; // f tm thi thnh int


f = i; // i tm thi thnh float
C th lm mt tnh chnh xc ca s nguyn
khi chuyn sang s thc hn ch!
int i = 3;
float f;
f = i; // f = 2.999995
Qun l b nh
5
&
VC
BB
Chuyn i tng minh (p kiu)

ngha
Ch ng chuyn i kiu (tm thi) nhm
trnh nhng kt qu sai lm.
C php
(<kiu chuyn i>)<biu thc>

V d
int x1 = 1, x2 = 2;
float f1 = x1 / x2; // f1 = 0.0
float f2 = (float)x1 / x2; // f2 = 0.5
float f3 = (float)(x1 / x2); // f3 = 0.0

Qun l b nh
6
&
VC
BB
Cp pht b nh tnh v ng

Cp pht tnh (static memory allocation)


Khai bo bin, cu trc, mng,
Bt buc phi bit trc cn bao nhiu b
nh lu tr tn b nh, khng thay i
c kch thc,
Cp pht ng (dynamic memory allocation)
Cn bao nhiu cp pht by nhiu.
C th gii phng nu khng cn s dng.
S dng vng nh ngoi chng trnh (c b
nh o virtual memory).
Qun l b nh
7
&
VC
BB
Cu trc mt CT C trong b nh

Ton b tp tin chng trnh s c np vo


b nh ti vng nh cn trng, gm 4 phn:
STACK Lu i tng cc b
Last-In First-Out Khi thc hin hm

Vng nh trng

Vng cp pht ng
HEAP (RAM trng v b nh o)
i tng ton cc Vng cp pht tnh
& tnh (kch thc c nh)
Gm cc lnh v hng
M chng trnh
(kch thc c nh)
Qun l b nh
8
&
VC
BB
Cp pht b nh ng

Thuc th vin <stdlib.h> hoc <alloc.h>


malloc
calloc
realloc
free
Trong C++
new
delete

Qun l b nh
9
&
VC
BB
Cp pht b nh ng

void *malloc(size_t size)

Cp pht trong HEAP mt vng nh size


(bytes)
size_t thay cho unsigned (trong <stddef.h>)

Thnh cng: Con tr n vng nh mi


c cp pht.
Tht bi: NULL (khng b nh).

int *p = (int *)malloc(10*sizeof(int));


if (p == NULL)
printf(Khong du bo nho!);

Qun l b nh
10
&
VC
BB
Cp pht b nh ng

void *calloc(size_t num, size_t size)

Cp pht vng nh gm num phn t trong


HEAP, mi phn t kch thc size (bytes)

Thnh cng: Con tr n vng nh mi


c cp pht.
Tht bi: NULL (khng b nh).

int *p = (int *)calloc(10, sizeof(int));


if (p == NULL)
printf(Khong du bo nho!);

Qun l b nh
11
&
VC
BB
Cp pht b nh ng

void *realloc(void *block, size_t size)

Cp pht li vng nh c kch thc size do


block tr n trong vng nh HEAP.
block == NULL s dng malloc
size == 0 s dng free
Thnh cng: Con tr n vng nh mi
c cp pht.
Tht bi: NULL (khng b nh).
int *p = (int *)malloc(10*sizeof(int));
p = (int *)realloc(p, 20*sizeof(int));
if (p == NULL)
printf(Khong du bo nho!);

Qun l b nh
12
&
VC
BB
Cp pht b nh ng

void free(void *ptr)

Gii phng vng nh do ptr tr n, c


cp bi cc hm malloc(), calloc(), realloc().
Nu ptr l NULL th khng lm g c.

Khng c.

int *p = (int *)malloc(10*sizeof(int));


free(p);

Qun l b nh
13
&
VC
BB
Cp pht b nh ng

<pointer_to_datatype> = new <datatype>[size]

Cp pht vng nh c kch thc


sizeof(<datatype>)*size trong HEAP

Thnh cng: Con tr n vng nh mi


c cp pht.
Tht bi: NULL (khng b nh).
int *a1 = (int *)malloc(sizeof(int));
int *a2 = new int;
int *p1 = (int *)malloc(10*sizeof(int));
int *p2 = new int[10];

Qun l b nh
14
&
VC
BB
Cp pht b nh ng

delete []<pointer_to_datatype>

Gii phng vng nh trong HEAP do


<pointer_to_datatype> tr n (c cp
pht bng new)

Khng c.

int *a = new int;


delete a;
int *p = new int[10];
delete []p;

Qun l b nh
15
&
VC
BB
Cp pht b nh ng

Lu
Khng cn kim tra con tr c NULL hay k
trc khi free hoc delete.
Cp pht bng malloc, calloc hay realloc th
gii phng bng free, cp pht bng new th
gii phng bng delete.
Cp pht bng new th gii phng bng
delete, cp pht mng bng new [] th gii
phng bng delete [].

Qun l b nh
16
&
VC
BB
Thao tc trn cc khi nh

Thuc th vin <string.h>


memset : gn gi tr cho tt c cc byte nh
trong khi.
memcpy : sao chp khi.
memmove : di chuyn thng tin t khi ny
sang khi khc.

Qun l b nh
17
&
VC
BB
Thao tc trn cc khi nh

void *memset(void *dest, int c, size_t count)

Gn count (bytes) u tin ca vng nh


m dest tr ti bng gi tr c (t 0 n 255)
Thng dng cho vng nh kiu char cn
vng nh kiu khc thng t gi tr zero.

Con tr dest.

char buffer[] = Hello world;


printf(Trc khi memset: %s\n, buffer);
memset(buffer, *, strlen(buffer));
printf(Sau khi memset: %s\n, buffer);

Qun l b nh
18
&
VC
BB
Thao tc trn cc khi nh

void *memcpy(void *dest, void *src, size_t count)

Sao chp chnh xc count byte t khi nh


src vo khi nh dest.
Nu hai khi nh ln nhau, hm s lm
vic khng chnh xc.

Con tr dest.

char src[] = *****;


char dest[] = 0123456789;
memcpy(dest, src, 5);
memcpy(dest + 3, dest + 2, 5);

Qun l b nh
19
&
VC
BB
Thao tc trn cc khi nh

void *memmove(void *dest, void *src, size_t count)

Sao chp chnh xc count byte t khi nh


src vo khi nh dest.
Nu hai khi nh ln nhau, hm vn
thc hin chnh xc.

Con tr dest.

char src[] = *****;


char dest[] = 0123456789;
memmove(dest, src, 5);
memmove(dest + 3, dest + 2, 5);

Qun l b nh
20
&
VC
BB
Bi tp

Bi 1: Ti sao cn phi gii phng khi nh c


cp pht ng?

Bi 2: iu g xy ra nu ta ni thm mt s k
t vo mt chui (c cp pht ng trc )
m khng cp pht li b nh cho n?

Qun l b nh
21
&
VC
BB
Bi tp

Bi 3: u im ca vic s dng cc hm thao


tc khi nh? Ta c th s dng mt vng lp
kt hp vi mt cu lnh gn khi to hay
sao chp cc byte nh hay khng?

Qun l b nh
22
&
VC
BB
Bi tp

Bi 4: Ta thng dng php p kiu trong


nhng trng hp no?

Bi 5: Gi s c kiu char, i kiu int, l kiu long.


Hy xc nh kiu ca cc biu thc sau:
(c + i + l)
(i + A)
(i + 32.0)
(100 + 1.0)
Qun l b nh
23
&
VC
BB
Bi tp

Bi 6: Vic cp pht ng ngha l g?


Bi 7: Cho bit s khc nhau gia malloc v


calloc?
malloc:
calloc:

Qun l b nh
24
&
VC
BB
Bi tp

Bi 8: Vit cu lnh s dng hm malloc cp


pht 1000 s kiu long.

Bi 9: Ging bi 8 nhng dng calloc


Qun l b nh
25
&
VC
BB
Bi tp

Bi 10: Cho bit s khc nhau gia memcpy v


memmove

Bi 11: Trnh by 2 cch khi to mng float


data[1000]; vi gi tr 0.
C1:
C2:

Qun l b nh
26
&
VC
BB
Bi tp

Bi 12: Kim tra li


void func()
{
int n1 = 100, n2 = 3;
float ketqua = n1 / n2;
printf("%d / %d = %f", n1, n2, ketqua);
}

Bi 13: Kim tra li


void main()
{
void *p;
p = (float *)malloc(sizeof(float));
*p = 1.23;
}
Qun l b nh
27
&
VC
BB
Bi tp

Bi 14: Vit hm cp pht mt vng nh


cha n s nguyn vi n cho trc v tr v
a ch vng nh .
Bi 15: Vit hm sao chp mng a, s lng
phn t n cho trc sang mng b cho trc
(kch thc ln hn hay bng n).
Bi 16: Vit hm tr v bn sao ca mt mng
s nguyn a, s lng phn t n cho trc.
Bi 17: Vit hm tr v mng o ca mt mng
s nguyn a, s lng phn t n cho trc. Yu
cu khng c thay i ni dung mng a. 28
Qun l b nh

You might also like