Upload
the-anh-thai
View
219
Download
0
Embed Size (px)
Citation preview
8/3/2019 bai 3. con tro trong c++
1/20
8/3/2019 bai 3. con tro trong c++
2/20
Ton t tham chiu (*)Bng cch s dng con tr chng ta c th truy xut trc tip n gi tr c lu tr trong binc tr bi nbng cch trc tn bin con tr mt du sao (*) - y c th c dch l"gi tr c tr bi". V vy, nu chng ta vit:
beth = *ted;
(chng ta c th c n l: "beth bng gi tr c tr bi ted" beth s mang gi tr 25, v tedbng 1776 v gi tr tr bi 1776 l 25.
Bn phi phn bit c rng ted c gi tr 1776, nhng *ted (vi mt du sao ng trc) tr tigi tr c lu tr trong a ch 1776, l 25. Hy ch s khc bit gia vic c hay khngc du sao tham chiu.
beth = ted; // beth bng ted ( 1776 )beth = *ted; // beth bng gi tr c tr bi( 25 )
Ton t ly a ch (&)N c dng nh l mt tin t ca bin v c th c dch l "a ch ca", v vy &variable1c th c c l "a ch ca variable1".Ton t tham chiu (*)N ch ra rng ci cn c tnh ton l ni dung c tr bi biu thc c coi nh l mt ach. N c th c dch l "gi tr c tr bi"..*mypointer c c l "gi tr c tr bi mypointer".
Vo lc ny, vi nhng v d vit trn
andy = 25;
ted = &andy;
bn c th d dng nhn ra tt c cc biu thc sau l ng:
andy == 25
&andy == 1776
ted == 1776*ted == 25
Khai bo bin kiu con trV con tr c kh nng tham chiu trc tip n gi tr m chng tr ti nn cn thit phi ch rkiu d liu no m mt bin con tr tr ti khai bo n. V vy, khai bo ca mt bin con tr
8/3/2019 bai 3. con tro trong c++
3/20
s c mu sau:
type * pointer_name;
trong type l kiu d liu c tr ti, khng phi l kiu ca bn thn con tr. V d:
int * number;
char * character;float * greatnumber;
l ba khai bo ca con tr. Mi bin u tr ti mt kiu d liu khc nhau nhng c ba u lcon tr v chng u chim mt lng b nh nh nhau (kch thc ca mt bin con tr tythuc vo h iu hnh). nhng d liu m chng tr ti khng chim lng b nh nh nhau,mt kiu int, mt kiu char v ci cn li kiu float.Ti phi nhn mnh li rng du sao (*) m chng ta t khi khai bo mt con tr ch c ngharng: l mt con trv hon ton khng lin quan n ton t tham chiu m chng ta xem
xt trc . n gin ch l hai tc v khc nhau c biu din bi cng mt du.
// my first pointer#include
int main ()
{int value1 = 5, value2 = 15;
int * mypointer;
mypointer = &value1;
*mypointer = 10;mypointer = &value2;
*mypointer = 20;
cout
8/3/2019 bai 3. con tro trong c++
4/20
// more pointers
#include
int main ()
{int value1 = 5, value2 = 15;
int *p1, *p2;
p1 = &value1; // p1 = a ch ca value1p2 = &value2; // p2 = a ch ca value2*p1 = 10; // gi tr tr bi p1 = 10*p2 = *p1; // gi tr tr bi p2 = gi tr tr bi p1p1 = p2; // p1 = p2 (php gn con tr)*p1 = 20; // gi tr tr bi p1 = 20
cout
8/3/2019 bai 3. con tro trong c++
5/20
numbers = p;bi v numbers l mt mng (con tr hng) v khng c gi tr no c th c gn cho cc hng.V con tr cng c mi tnh cht ca mt bin nn tt c cc biu thc ccon tr trong v ddi y l hon ton hp l:
// more pointers
#includeint main ()
{
int numbers[5];
int * p;
p = numbers; *p = 10;p++; *p = 20;
p = &numbers[2]; *p = 30;p = numbers + 3; *p = 40;
p = numbers; *(p+4) = 50;
for (int n=0; n
8/3/2019 bai 3. con tro trong c++
6/20
int number;
int *tommy;tommy = &number;
Trong mt php gn con tr chng ta phi lun lun gn a ch m n tr ti ch khng phi lgi tr m n tr ti. Bn cn phi nh rng khi khai bo mt bin con tr, du sao (*) c dng
ch ra n l mt con tr, v hon ton khc vi ton t tham chiu. l hai ton t khcnhau mc d chng c vit vi cng mt du. V vy, cc cu lnh sau l khng hp l:
int number;
int *tommy;
*tommy = &number;
Nh i vi mng, trnh bin dch cho php chng ta khi to gi tr m con tr tr ti bng gitr hng vo thi im khai bo bin con tr:
char * terry = "hello";
trong trng hp ny mt khi nh tnh c dnh cha "hello" v mt con tr tr ti k tu tin ca khi nh ny ( l k t h ) c gn cho terry. Nu "hello" c lu ti a ch1702, lnh khai bo trn c th c hnh dung nh th ny:
cn phi nhc li rng terry mang gi tr 1702 ch khng phi l h hay "hello".Bin con tr terry tr ti mt xu k t v n c th c s dng nh l i vi mt mng (hynh rng mt mng ch n thun l mt con tr hng). V d, nu chng ta mun thay k t obng mt du chm than, chng ta c th thc hin vic bng hai cch:
terry[4] = ! ;
*(terry+4) = ! ;
hy nh rng vit terry[4] l hon ton ging vi vit *(terry+4) mc d biu thc thng dngnht l ci u tin. Vi mt trong hai lnh trn xu do terry tr n s c gi tr nh sau:
Cc php tnh s hc vi pointerVic thc hin cc php tnh s hc vi con tr hi khc so vi cc kiu d liu s nguyn khc.Trc ht, ch php cng v tr l c php dng. Nhng c cng v tr u cho kt qu phthuc vo kch thc ca kiu d liu m bin con tr tr ti.Chng ta thy c nhiu kiu d liu khc nhau tn ti v chng c th chim ch nhiu hn hoct hn cc kiu d liu khc. V d, trong cc kiu s nguyn, char chim 1 byte, short chim 2byte v long chim 4 byte.
8/3/2019 bai 3. con tro trong c++
7/20
Gi s chng ta c 3 con tr sau:
char *mychar;
short *myshort;
long *mylong;v chng ln lt tr ti nh 1000, 2000 and 3000.Nu chng ta vit
mychar++;
myshort++;mylong++;
mychar - nh bn mong i - s mang gi tr 1001. Tuy nhin myshort s mang gi tr 2002 vmylong mang gi tr 3004. Nguyn nhn l khi cng thm 1 vo mt con tr th n s tr ti
phn t tip theo c cng kiu m n c nh ngha, v vy kch thc tnh bng byte cakiu d liu n tr ti s c cng thm vo bin con tr.iu ny ng vi c hai php ton cng v tr i vi con tr. Chng ta cng hon ton thuc kt qu nh trn nu vit:
mychar = mychar + 1;myshort = myshort + 1;
mylong = mylong + 1;
Cn phi cnhbo bn rng c hai ton t tng (++) v gim (--) u c quyn u tin ln hnton t tham chiu (*), v vy biu thc sau y c th dn ti kt qu sai:
*p++;*p++ = *q++;
Lnh u tin tng ng vi *(p++) iu m n thc hin l tng p (a ch nh m n trti ch khng phi l gi tr tr ti).Lnh th hai, c hai ton t tng (++) u c thc hin sau khi gi tr ca *q c gn cho *pv sau c q v p u tng ln 1. Lnh ny tng ng vi:
*p = *q;
p++;
q++;
Nh ni trong cc bi trc, ti khuyn cc bn nn dng cc cp ngoc n trnh nhngkt qu khng mong mun.
Con tr tr ti con trC++ cho php s dng cc con tr tr ti cc con tr khc ging nh l tr ti d liu. lmvic chng ta ch cn thm mt du sao (*) cho mi mc tham chiu.
8/3/2019 bai 3. con tro trong c++
8/20
char a;char * b;
char ** c;
a = z ;
b = &a;c = &b;
gi s rng a,b,c c lu cc nh 7230, 8092 and 10502, ta c th m t on m trn nhsau:
im mi trong v d ny l bin c, chng ta c th ni v n theo 3 cch khc nhau, mi cch stng ng vi mt gi tr khc nhau:
c l mt bin c kiu (char **) mang gi tr 8092*c l mt bin c kiu (char*) mang gi tr 7230**c l mt bin c kiu (char) mang gi tr z
Con tr khng kiuCon tr khng kiu l mt loi con tr c bit. N c th tr ti bt k loi d liu no, t gi trnguyn hoc thc cho ti mt xu k t. Hn ch duy nht ca n l d liu c tr ti khngth c tham chiu ti mt cch trc tip (chng ta khng th dng ton t tham chiu * vichng) v di ca n l khng xc nh v v vy chng ta phi dng n ton t chuyn kiud liu hay php gn chuyn con tr khng kiu thnh mt con tr tr ti mt loi d liu cth.Mt trong nhng tin ch ca n l cho php truyn tham s cho hm m khng cn ch r kiu
// integer increaser
#includevoid increase (void* data, int type)
{
switch (type)
{case sizeof(char) : (*((char*)data))++; break;
case sizeof(short): (*((short*)data))++; break;
case sizeof(long) : (*((long*)data))++; break;
}}
int main ()
8/3/2019 bai 3. con tro trong c++
9/20
{
char a = 5;short b = 9;
long c = 12;
increase (&a,sizeof(a));
increase (&b,sizeof(b));increase (&c,sizeof(c));
cout
8/3/2019 bai 3. con tro trong c++
10/20
}
8
Trong v d ny, minus l mt con tr ton cc tr ti mt hm c hai tham s kiu int, con tr
ny c gm tr ti hm subtraction, tt c u trn mt dng:
int (* minus)(int,int) = subtraction;
8/3/2019 bai 3. con tro trong c++
11/20
int * bobby;
bobby = new int [5];trong trng hp ny, h iu hnh dnh ch cho 5 phn t kiu int trong b nh v tr v mtcon tr tr n u ca khi nh. V vy lc ny bobby tr n mt khi nh hp l gm 5 phnt int.
Bn c th hi ti l c g khc nhau gia vic khai bo mt mng vi vic cp pht b nh chomt con tr nh chng ta va lm. iu quan trng nht l kch thc ca mt mng phi l mthng, iu ny gii hn kch thc ca mng n kch thc m chng ta chn khi thit kchng trnh trong khi cp pht b nh ng cho php cp pht b nh trong qu trnh chyvi kch thc bt k.B nh ng ni chung c qun l bi h iu hnh v trong cc mi trng a nhim c thchymt lc vi chng trnh c mt kh nng c th xy ra l ht b nh cp pht. Nu iuny xy ra v h iu hnh khng th cp pht b nh nh chng ta yu cu vi ton t new, mt
con tr null (zero) s c tr v. V vy cc bn nn kim tra xem con tr tr v bi ton t newc bng null hay khng:
int * bobby;
bobby = new int [5];
if (bobby == NULL) {// error assigning memory. Take measures.
};
Ton t delete.V b nh ng ch cn thit trong mt khong thi gian nht nh, khi n khng cn dng nna th n s c gii phng c th cp pht cho cc nhu cu khc trong tng lai. thchin vic ny ta dng ton t delete, dng thc ca n nh sau:
delete pointer;hoc
delete [] pointer;Biu thc u tin nn c dng gii phng b nh c cp pht cho mt phn t v lnhth hai dng gii phng mt khi nh gm nhiu phn t (mng). Trong hu ht cc trnhdch c hai biu thc l tng ng mc d chng l r rng l hai ton t khc nhau.
// rememb-o-matic
#include
8/3/2019 bai 3. con tro trong c++
12/20
#include
int main (){
char input [100];
int i,n;
long * l, total = 0;cout
8/3/2019 bai 3. con tro trong c++
13/20
void * malloc (size_t nbytes);
trong nbytes l s byte chng ta mun gn cho con tr. Hm ny tr v mt con tr kiuvoid*, v vy chng ta phi chuyn i kiu sang kiu ca con tr ch, v d:
char * ronny;
ronny = (char *) malloc (10);on m ny cp pht cho con tr ronny mt khi nh 10 byte. Khi chng ta mun cp pht mtkhi d liu c kiu khc char (ln hn 1 byte) chng ta phi nhn s phn t mong mun vikch thc ca chng. Tht may mn l chng ta c ton t sizeof, ton t ny tr v kch thcca mt kiu d liu c th.
int * bobby;
bobby = (int *) malloc (5 * sizeof(int));on m ny cp pht cho bobby mt khi nh gm 5 s nguyn kiu int, kch c ca kiu dliu ny c th bng 2, 4 hay hn ty thuc vo h thng m chng trnh c dch.Hm calloc.
calloc hot ng rt ging vi malloc, s khc nhau ch yu l khai bo mu ca n:
void * calloc (size_t nelements, size_t size);
n s dng hai tham s thay v mt. Hai tham s ny c nhn vi nhau c c kch thctng cng ca khi nh cn cp pht. Thng thng tham s u tin (nelements) l s phn tv tham s thc hai (size) l kch thc ca mi phn t. V d, chng ta c th nh nghabobby vi calloc nh sau:
int * bobby;
bobby = (int *) calloc (5, sizeof(int));
Mt im khc nhau na gia malloc v calloc l calloc khi to tt c cc phn t ca n v 0.Hm realloc.
N thay i kch thc ca khi nh c cp pht cho mt con tr.
void * realloc (void * pointer, size_t size);
tham s pointer nhn vo mt con tr c cp pht b nh hay mt con tr null, v size chnh kch thc ca khi nh mi. Hm ny s cp pht size byte b nh cho con tr. N c thphi thay i v v tr ca khinh c th ch cho kch thc mi ca khi nh, trongtrng hp ny ni dung hin thi ca khi nh c copy ti v tr mi m bo d liukhng b mt. Con tr mi tr ti khi nh c hm tr v. Nu khng th thay i kch thcca khi nh th hm s tr v mt con tr null nhng tham s pointer v ni dung ca n skhng b thay i.Hm free.
8/3/2019 bai 3. con tro trong c++
14/20
Hm ny gii phng mt khi nh ng c cp pht bi malloc, calloc hoc realloc.
void free (void * pointer);
Hm ny ch c dng gii phng b nh c cp pht bi cc hm malloc, calloc andrealloc.
Bi 3.5 Cc cu trcCc cu trc d liu.Mt cu trc d liu l mt tp hp ca nhng kiu d liu khc nhau c gp li vi mt citn duy nht. Dng thc ca n nh sau:
struct model_name {
type1 element1;type2 element2;
type3 element3;
.
.} object_name;
trong model_name l tn ca mu kiu d liu v tham s ty chn object_name mt tn hpl cho i tng. Bn trong cp ngoc nhn l tn cc phn t ca cu trc v kiu ca chng.Nu nh ngha ca cu trc bao gm tham s model_name (tu chn), tham s ny tr thnhmt tn kiu hp l tng ng vi cu trc. V d:
struct products {char name [30];
float price;
} ;products apple;
products orange, melon;
Chng ta nh ngha cu trc products vi hai trng: name v price, mi trng c mt kiukhc nhau. Chng ta cng s dng tn ca kiu cu trc (products) khai bo ba i tngc kiu : apple, orange v melon.Sau khi c khai bo, products tr thnh mt tn kiu hp l ging cc kiu c bn nh int,
8/3/2019 bai 3. con tro trong c++
15/20
char hay short.
Trng tu chn object_name c th nm cui ca phn khai bo cu trc dng khai botrc tip i tng c kiu cu trc. V d, khai bo cc i tng apple, orange v melonnh lm phn trc chng ta cng c th lm theo cch sau:
struct products {char name [30];
float price;
} apple, orange, melon;Hn na, trong trng hp ny tham s model_name tr thnh tu chn. Mc d numodel_name khng c s dng th chng ta s khng th khai bo thm cc i tng c kiumu ny.Mt iu quan trng l cn phn bit r rng u l kiu mu cu trc, u l i tng cu trc.Nu dng cc thut ng chng ta s dng vi cc bin, kiu mu l tn kiu d liu cn itng l cc bin.Sau khi khai bo ba i tng c kiu l mt mu cu trc xc nh (apple, orange and melon)
chng ta c th thao tc vi cc trng to nn chng. lm vic ny chng ta s dng mtdu chm (.) chn gia tn i tng vtn trng. V d, chng ta c th thao tc vi bt kphn t no ca cu trc nh l i vi cc bin chun :
apple.name
apple.priceorange.name
orange.price
melon.namemelon.price
mi trng c kiu d liu tng ng: apple.name, orange.name v melon.name c kiuchar[30], v apple.price, orange.price v melon.price c kiu float.Chng ta tm bit apples, oranges v melons n vi mt v d v cc b phim:
// example about structures#include
#include
#include
struct movies_t {char title [50];
int year;
} mine, yours;
void printmovie (movies_t movie);int main ()
{
8/3/2019 bai 3. con tro trong c++
16/20
char buffer [50];
strcpy (mine.title, "2001 A Space Odyssey");mine.year = 1968;
cout
8/3/2019 bai 3. con tro trong c++
17/20
#define N_MOVIES 5
struct movies_t {char title [50];
int year;
} films [N_MOVIES];
void printmovie (movies_t movie);int main ()
{
char buffer [50];int n;
for (n=0; n
{cout
8/3/2019 bai 3. con tro trong c++
18/20
Con tr tr n cu trc
Nh bt k cc kiu d liu no khc, cc cu trc c th c tr n bi con tr. Quy tc honton ging nh i vi bt k kiu d liu c bn no:
struct movies_t {char title [50];
int year;
};movies_t amovie;
movies_t * pmovie;
y amovie l mt i tng c kiu movies_t v pmovie l mt con tr tr ti i tngmovies_t. OK, by gi chng ta s n vi mt v d khc, n s gii thiu mt ton t mi:
// pointers to structures
#include#include
struct movies_t {
char title [50];int year;
};
int main (){
char buffer[50];
movies_t amovie;movies_t * pmovie;
pmovie = & amovie;
cout title,50);
cout year = atoi (buffer);cout
8/3/2019 bai 3. con tro trong c++
19/20
Enter title: MatrixEnter year: 1999
You have entered:
Matrix (1999)
on m trn gii thiu mt iu quan trng: ton t ->. y l mt ton t tham chiu ch dng tr ti cc cu trc v cc lp (class). N cho php chng ta khng phi dng ngoc mi khitham chiu n mt phn t ca cu trc. Trong v d ny chng ta s dng:
movies->title
n c th c dch thnh:
(*movies).title
c hai biu thc movies->title v (*movies).title u hp l v chng u dng tham chiun phn t title ca cu trc c tr bi movies. Bn cn phn bit r rng vi:
*movies.title
n tng ng vi
*(movies.title)
lnh ny dng tnh ton gi tr c tr bi phn t title ca cu trc movies, trong trnghp ny (title khng phi l mt con tr) n chng c ngha g nhiu. Bn di y tng kt ttc cc kt hp c th c gia con tr v cu trc:
Biu thcM tTng ng vi
movies.title
Phn t title ca cu trc movies
8/3/2019 bai 3. con tro trong c++
20/20
movies->title
Phn t title ca cu trc c tr bi movies(*movies).title
*movies.titleGi tr c tr bi phn t title ca cu trc movies*(movies.title)
Cc cu trc lng nhauCc cu trc c th c t lng nhau v vy mt phn t hp l ca mt cu trc c th l mtcu trc khc.
struct movies_t {
char title [50];int year;
}struct friends_t {
char name [50];
char email [50];
movies_t favourite_movie;} charlie, maria;
friends_t * pfriends = &charlie;
V vy, sau phn khai bo trn chng ta c th s dng cc biu thc sau:
charlie.namemaria.favourite_movie.title
charlie.favourite_movie.year
pfriends->favourite_movie.year
(trong hai biu thc cui cng l tng ng).Cc khi nim c bn v cu trc c cp n trong phn ny l hon ton ging vi ngnng C, tuy nhin trong C++, cu trc c m rng thm cc chc nng ca mt lp vi tnhcht c trng l tt c cc phn t ca n u l cng cng (public). Bn s c thm cc thngtin chi tit trong phn 4.1, Lp.