You are on page 1of 52

Trnh Thnh Trung (ThS)

trungtt@soict.hust.edu.vn

Bi 2
C/C++ nng cao
Ni dung
1. Con tr
2. Qun l b nh
3. Hm v tham s
4. a nng ha
1.
Con tr
Pointer
Con tr
Pointer

Khi nim
Gi tr cc bin c lu tr trong b nh my tnh, c th truy
cp ti cc gi tr qua tn bin, ng thi cng c th qua a
ch ca chng trong b nh.
Thc cht l 1 bin m ni dung ca n l a ch ca 1 i
tng khc (bin, hm, nhng khng phi 1 hng s).
Vic s dng con tr cho php ta truy nhp ti 1 i tng
gin tip qua a ch ca n.
C nhiu kiu bin vi cc kch thc khc nhau, nn c
nhiu kiu con tr.
V d: Con tr int tr ti bin hay hm kiu int.
Con tr
Pointer

Khai bo con tr :
Syntax : dataType * PointerName;
Ch rng y l con tr
Sau khi khai bo, ta c con tr NULL (cha tr ti 1 i tng
no)
s dng con tr, ta dng ton t ly a ch &
PointerName = &VarName
V d
int a; int *p; a=10;
p= &a;
ly ni dung bin do con tr tr ti, ta dng ton t ly ni dung *
* PointerName
V d
int i,j,*p; 100 i
i= 5; p= & i; 102 j
j= *p; *p= j+2; 104 p

100 5 i 100 5 i
Gn i=5 gn p = & i
102 j
102 j
104 p 104 100 p

100 5 i
100 7 i
gn j = *p *p = j+2
102 5 j
102 5 j
104 100 p
104 100 p
Ch

Mt con tr ch c th tr ti 1 i tng cng kiu


Ton t 1 ngi * v & c u tin cao hn cc ton t s hc
Ta c th vit *p cho mi ni c i tng m n tr ti xut hin
int x = 5, *p; p = & x;
x=x+10; ~ *p = *p+10;
Ta cng c th gn ni dung 2 con tr cho nhau: khi c hai con
tr cng tr ti 1 i tng
int x=10, *p, *q;
p = &x; q = p;
=> p v q cng tr ti x
Th t u tin
cc php ton
Cc php ton
trn con tr

Cng hoc tr vi 1 s nguyn n tr v 1 con tr cng kiu,


l a ch mi tr ti 1 i tng khc nm cch i tng
ang b tr n phn t
Tr 2 con tr cho ta khong cch (s phn t) gia 2 con tr
KHNG c php cng, nhn, chia 2 con tr
C th dng cc php gn, so snh cc con tr
Ch n s tng thch v kiu.
V d

char *pchar; short *pshort; long *plong;


pchar ++; pshort ++; plong ++;

Gi s cc a ch ban u tng ng ca 3 con tr l 100,


200 v 300, kt qu ta c cc gi tr 101, 202 v 304 tng
ng

Nu vit tip
plong += 5; => plong = 324
pchar -=10; => pchar = 91
pshort +=5; => pshort = 212
Ch

++ v -- c u tin cao hn * nn *p++ tng ng vi *(p++)


tc l tng a ch m n tr ti ch khng phi tng gi tr m n
cha.
*p++ = *q++ s tng ng vi
*p = *q;
p=p+1;
q=q+1;

++*p = ++*q; //??? Dng ( ) trnh nhm ln


Con tr
void*

L con tr khng nh kiu. N c th tr ti bt k mt loi


bin no.
Thc cht mt con tr void ch cha mt a ch b nh m
khng bit rng ti a ch c i tng kiu d liu g. =>
khng th truy cp ni dung ca mt i tng thng qua con
tr void.
truy cp c i tng th trc ht phi p kiu bin
tr void thnh bin tr c nh kiu ca kiu i tng
Con tr
void*

float x; int y;
void *p; // khai bo con tr void
p = &x; // p cha a ch s thc x
*p = 2.5; // bo li v p l con tr void
/* cn phi p kiu con tr void trc khi truy
cp i tng qua con tr */
*((float*)p) = 2.5; // x = 2.5
p = &y; // p cha a ch s nguyn y
*((int*)p) = 2; // y = 2
V d
(float) *p=2.5;
*p= (float *) 2.5;
*(float)p =2.5;
(float *) p =2.5;
(float *) *p=2.5;
*((float *) p )=2.5;
Con tr v
mng

Gi s ta c int a[30]; th &a[0] l a ch phn t u


tin ca mng , ng thi l a ch ca mng.
Trong C, tn ca mng chnh l 1 hng a ch = a ch ca
phn t u tin ca mng
a = &a[0];
a+i = &a[i];
Con tr v
mng

Tuy vy cn ch rng a l 1 hng => khng th dng n


trong cu lnh gn hay ton t tng, gim nh a++;
Xt con tr: int *pa;
pa = &a[0];
=> pa tr vo phn t th nht ca mng v
pa +1 s tr vo phn t th 2 ca mng
*(pa+i) s l ni dung ca a[i]
Con tr
xu

Ta c char tinhthanh[30] =Da Lat;


Tng ng :
char *tinhthanh;
tinhthanh=Da lat;
Hoc : char *tinhthanh =Da lat;
Ngoi ra cc thao tc trn xu cng tng t nh trn mng
*(tinhthanh+3) = l
Ch : vi xu thng th khng th gn trc tip nh dng
th 3
Mng cc
con tr

Con tr cng l mt loi d liu nn ta c th to


mt mng cc phn t l con tr theo dng thc.
<kiu> *<mng con tr>[<s phn t>];
V d: char *ds[10];
ds l 1 mng gm 10 phn t, mi phn t l 1 con
tr kiu char, c dng lu tr c ca 10 xu
k t no
Cng c th khi to trc tip cc gi tr khi khai
bo
char * ma[10] = {mot,hai,ba...};
Ch

Cn phn bit mng con tr v mng nhiu chiu.


Mng nhiu chiu l mng thc s c khai bo v c
vng nh dnh sn cho cc phn t.
Mng con tr ch dnh khng gian nh cho cc bin tr
(cha a ch). Khi khi to hay gn gi tr: cn thm b nh
cho cc phn t s dng => tn nhiu hn
Mng cc
con tr

Mt u im khc ca mng tr l ta c th hon chuyn cc


i tng (mng con, cu trc..) c tr bi con tr ny
bng cch hon chuyn cc con tr
u im tip theo l vic truyn tham s trong hm
V d: Vo danh sch lp theo h v tn, sau sp xp
in ra theo th t ABC.

#include <stdio.h>
#include <string.h>
#define MAXHS 50
#define MAXLEN 30
int main () {
int i, j, count = 0; char ds[MAXHS][MAXLEN];
char *ptr[MAXHS], *tmp;
while ( count < MAXHS) {
printf( Vao hoc sinh thu : %d ,count+1);
gets(ds[count]);
if (strlen(ds[count] == 0) break;
ptr[count] = ds +count;
++count;
}
for ( i=0;i<count-1;i++)
for ( j =i+1;j < count; j++)
if (strcmp(ptr[i],ptr[j])>0) {
tmp=ptr[i]; ptr[i] = ptr[j]; ptr[j] = tmp;
}
for (i=0;i<count; i++)
printf(\n %d : %s, i+1,ptr[i]);
}
Con tr
tr ti con tr
Bn thn con tr cng l 1 bin, v vy n cng c a ch v c th
dng 1 con tr khc tr ti a ch .
<Kiu DL> **<Tn bin tr>;
V d: int x = 12;
int *p1 = &x;
int **p2 = &p1;
C th m t 1 mng 2 chiu qua con tr ca con tr theo cng
thc :
M[i][k] = *(*(M+i)+k)
Vi
M+i l a ch ca phn t th i ca mng
*(M+i) cho ni dung phn t trn
*(M+i)+k l a ch phn t [i][k]
Con tr
tr ti con tr
V d: in ra 1 ma trn vung v cng mi phn t
ca ma trn vi 10
#include <stdio.h> for (i=0; i<hang; i++) {
#define hang 3 for (j=0; j<cot; j++) {
#define cot 3
*(*(mt+i)+j)=*(*(mt+i)+j) +10;
int main() {
int mt[hang][cot] = {{7,8,9}, printf( %d , *(*(mt+i)+j);
{10,13,15}, }
{2,7,8}}; printf(\n); }
int i,j; }
for (i=o; i<hang; i++) {
for (j=0; j<cot; j++)
printf( %d , mt[i][j]);
printf(\n);
}
2.
Qun l b nh
Memory management
B nh
ng

Cho n lc ny ta ch dng b nh tnh: tc l khai bo


mng, bin v cc i tng khc mt cch tng minh trc
khi thc hin chng trnh.
Trong thc t nhiu khi ta khng th xc nh trc c
kch thc b nh cn thit lm vic, v phi tr gi bng
vic khai bo d tr qu ln
Nhiu i tng c kch thc thay i linh hot
B nh
ng

Vic dng b nh ng cho php xc nh b nh cn thit


trong qu trnh thc hin ca chng trnh, ng thi gii
phng chng khi khng cn cn n dng b nh cho vic
khc
Trong C ta dng cc hm malloc, calloc, realloc v free
xin cp pht, ti cp pht v gii phng b nh.
Trong C++ ta dng new v delete
Xin cp pht b nh
new v delete

xin cp pht b nh ta dng :


<bin tr> = new <kiu d liu>;
hoc <bin tr> = new <kiu d liu>[S phn t];
dng trn xin cp pht mt vng nh cho mt bin n, cn
dng di cho mt mng cc phn t c cng kiu vi kiu d
liu.

Gii phng b nh
delete ptr; // xa 1 bin n
delete [] ptr; // xa 1 bin mng
Xin cp pht b nh
new v delete

B nh ng c qun l bi h iu hnh, c chia s


gia hng lot cc ng dng, v vy c th khng b nh.
Khi ton t new s tr v con tr NULL.
V d:
int *pds;
pds = new int [200];
if (pds == NULL) { // thng bo li v x l
V d

#include <stdio.h>
int main() {
int i,n; long total=100,x,*ds;
printf(" Vao so ptu "); scanf(%d,&n);
ds = new long [n];
if (ds==NULL) exit(1);
for (i=0;i<n;i++){
printf("\n Vao so thu %d : ", i+1 );
scanf(%d,&ds[i] );
}
printf(Danh sach cac so : \n);
for (i=0;i<n;i++) printf(%d,ds[i]);
delete []ds;
return 0;
}
B nh ng cho
mng 2 chiu

C1: Coi mt mng 2 chiu l 1 mng 1 chiu

Gi X l mng hai chiu c kch thc m dng v n ct.


A l mng mt chiu tng ng ,th X[i][j] = A[ i*n + j]
B nh ng cho
mng 2 chiu

C2. Dng con tr ca con tr


V d: Vi mng s nguyn 2 chiu c kch thc l R * C ta
khai bo nh sau :
int **mt;
mt = new int *[R];
int *temp = new int[R*C];
for (i=0; i< R; ++i) {
mt[i] = temp;
temp += C;
}
gii phng:
delete [] mt[0];
delete [] mt;
V d
// Khi to ma trn vi // Gii phng
// R hng v C ct for(i=0; i<R;i++)
float ** M = new float *[R]; // Gii phng cc hng
for (i=0; i<R;i++) delete []M[i];
M[i] = new float[C]; delete []M;
// Dng M[i][j] cho
// cc phn t ca ma trn
3.
Hm v tham s
Function
Hm v truyn
tham s

Chng trnh C c cu trc thng qua cc hm. Mi hm l


mt module nh trong chng trnh,c th c gi nhiu ln.
C ch c hm, c th coi th tc l mt hm khng c d liu tr
v. C cng khng c khi nim hm con, tt c cc hm k c hm
chnh (main) u c cng mt cp duy nht (cu trc hm ng
cp). Mt hm c th gi mt hm khc bt k ca chng trnh.
syntax :
[<kiu tr v>] <tn hm>([<danh sch tham s>])
{
<thn hm>
}
Hm v truyn
tham s

Trong C , tn hm phi l duy nht, li gi hm phi c cc i


s ng bng v hp tng ng v kiu vi tham s trong n
hm.C ch c duy nht 1 cch truyn tham s: tham tr (k c dng
a ch cng vy)
Trong C++ : ngoi truyn tham tr, C++ cn cho php truyn
tham chiu. Tham s trong C++ cn c kiu tham s ngm nh
(default parameter), v vy s i s trong li gi hm c th t hn
tham s nh ngha. ng thi C++ cn c c ch a nng ha hm,
v vy tn hm khng phi duy nht.
Php
tham chiu

Hm nhn tham s l con tr


void Swap(int *X, int *Y)
{
int Temp = *X;
*X = *Y;
*Y = Temp;
}
hon i gi tr hai bin A v B
Swap(&A, &B);
Php
tham chiu {C++}
Hm nhn tham s l tham chiu
void Swap(int &X, int &Y);
{
int Temp = X;
X = Y;
Y = Temp;
}
hon i gi tr hai bin A v B
Swap(A, B);
Php #include <iostream.h>

tham chiu int X = 4;


int & MyFunc()
{
Khi mt hm tr v mt return X;
tham chiu, chng ta c }
th gi hm pha bn tri
ca mt php gn. int main()
{
cout<<"X="<<X<<endl;
cout<<"X="<<MyFunc()<<endl;
MyFunc() = 20; // ~X=20
cout<<"X="<<X<<endl;
return 0;
}
Hm vi
tham s ngm nh {C++}
nh ngha cc gi tr tham s mc nh cho cc hm
V d
void MyDelay(long Loops = 1000)
{
for(int I = 0; I < Loops; ++I) ;
}

MyDelay(); // Loops c gi tr l 1000


MyDelay(5000); // Loops c gi tr l 5000
Ch

Nu c prototype, cc tham s c gi tr mc nh ch c cho


trong prototype ca hm v khng c lp li trong nh ngha
hm (V trnh bin dch s dng cc thng tin trong prototype ch
khng phi trong nh ngha hm to mt lnh gi).
Mt hm c th c nhiu tham s c gi tr mc nh. Cc tham s
c gi tr mc nh cn phi c nhm li vo cc tham s cui
cng (hoc duy nht) ca mt hm. Khi gi hm c nhiu tham s
c gi tr mc nh, chng ta ch c th b bt cc tham s theo th
t t phi sang tri v phi b lin tip nhau
V d
int MyFunc(int a= 1, int b,
int c = 3, int d = 4); //
int MyFunc(int a, int b = 2,
int c = 3, int d = 4); //
4.
a nng ha
Overloading
a nng ha
hm {C++}
Cung cp nhiu hn mt nh ngha cho tn hm cho
trong cng mt phm vi.
Trnh bin dch s la chn phin bn thch hp ca hm
hay ton t da trn cc tham s m n c gi.

C C++
int abs(int i); int abs(int i);
long labs(long l); long abs(long l);
double abs(double d);
double fabs(double d);
a nng ha
ton t {C++}
nh ngha li chc nng ca cc ton t c sn
Th hin cc php ton mt cch t nhin hn

V d: thc hin cc php cng, tr s phc


Trong C: Cn phi xy dng cc hm AddSP(), TruSP()
Khng th hin c php cng v tr cho cc biu thc nh
a=b+c-d+e+f-h-k
#include <stdio.h>
// nh ngha s phc
struct SP {
V d double THUC;
double AO;
cng, tr s };

phc trong SP SetSP(double R,double I);


SP AddSP(SP C1,SP C2);

C SP SubSP(SP C1,SP C2);


void DisplaySP(SP C);
int main(void) {
SP C1,C2,C3,C4;
C1 = SetSP(1.0,2.0);
C2 = SetSP(-3.0,4.0);
cout <<"\nSo phuc thu nhat:";
DisplaySP(C1);
cout << "\nSo phuc thu hai:";
DisplaySP(C2);
C3 = AddSP(C1,C2);
C4 = SubSP(C1,C2);
cout <<"\nTong hai so phuc nay:";
DisplaySP(C3);
cout << "\nHieu hai so phuc nay:";
DisplaySP(C4);
return 0;
}
V d SP SetSP(double R,double I) {
SP Tmp;
cng, tr s Tmp.THUC = R; Tmp.AO = I;
return Tmp; }
phc trong SP AddSP(SP C1,SP C2) {

C SP Tmp;
Tmp.THUC = C1.THUC+C2.THUC;
Tmp.AO = C1.AO+C2.AO;
return Tmp; }

SP SubSP(SP C1,SP C2) {


SP Tmp;
Tmp.THUC = C1.THUC-C2.THUC;
Tmp.AO = C1.AO-C2.AO;
return Tmp; }

void DisplaySP(SP C) {
cout <<C.THUC << i <<C.AO; }
a nng ha
ton t {C++}
C php
data_type operator operator_symbol (parameters)
{
}
data_type: Kiu tr v.
operator_symbol: K hiu ca ton t.
parameters: Cc tham s (nu c).
#include <iostream.h>
// nh ngha s phc
typedef struct SP
V d {
double THUC;
cng, tr s };
double AO;

phc trong SP SetSP(double R,double I);


void DisplaySP(SP C);

C++ SP operator + (SP C1,SP C2);


SP operator - (SP C1,SP C2);

int main() {
SP C1,C2,C3,C4;
C1 = SetSP(1.1,2.0);
C2 = SetSP(-3.0,4.0);
cout<<"\nSo phuc thu nhat:";
DisplaySP(C1);
cout<<"\nSo phuc thu hai:";
DisplaySP(C2);
C3 = C1 + C2; C4 = C1 - C2;
cout<<"\nTong hai so phuc nay:";
DisplaySP(C3);
cout<<"\nHieu hai so phuc nay:";
DisplaySP(C4);
return 0;
}
V d SetSP(double R,double I) {
SP Tmp;
cng, tr s Tmp.THUC = R; Tmp.AO = I; return Tmp; }

phc trong //Cong hai so phuc


SP operator + (SP C1,SP C2) {

C++ SP Tmp;
Tmp.THUC = C1.THUC+C2.THUC;
Tmp.AO = C1.AO+C2.AO;
return Tmp;
}

//Tru hai so phuc


SP operator - (SP C1,SP C2) {
SP Tmp;
Tmp.THUC = C1.THUC-C2.THUC;
Tmp.AO = C1.AO-C2.AO;
return Tmp;
}

//Hien thi so phuc


void DisplaySP(SP C) {
printf(\n %f , %f ,C.THUC);
}
Gii hn ca
a nng ha ton t

Khng th nh ngha cc ton t mi.


Hu ht cc ton t ca C++ u c th c a nng ha.
Cc ton t sau khng a nng ha c
1. :: Ton t nh phm vi.
2. .* Truy cp n con tr l trng ca struct hay class.
3. . Truy cp n trng ca struct hay class.
4. ? Ton t iu kin
5. sizeof
6. Cc k hiu tin x l
Gii hn ca
a nng ha ton t

Khng th thay i th t u tin ca mt ton t cng nh


s cc ton hng ca n.
Khng th thay i ngha ca cc ton t khi p dng cho
cc kiu c sn.
a nng ha cc ton t khng th c cc tham s c gi tr
mc nh.
Thanks!
Any questions?
Email me at trungtt@soict.hust.edu.vn

Presentation template by SlidesCarnival

You might also like