bai 3. con tro trong c++

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.