You are on page 1of 10

Lp trnh cn bn

Chng VII KIU CON TR


Hc xong chng ny, sinh vin s nm c cc vn sau: Khi nim v kiu d liu con tr. Cch khai bo v cch s dng bin kiu con tr. Mi quan h gia mng v con tr.

I. GII THIU KIU D LIU CON TR


Cc bin chng ta bit v s dng trc y u l bin c kch thc v kiu d liu xc nh. Ngi ta gi cc bin kiu ny l bin tnh. Khi khai bo bin tnh, mt lng nh cho cc bin ny s c cp pht m khng cn bit trong qu trnh thc thi chng trnh c s dng ht lng nh ny hay khng. Mt khc, cc bin tnh dng ny s tn ti trong sut thi gian thc thi chng trnh d c nhng bin m chng trnh ch s dng 1 ln ri b. Mt s hn ch c th gp phi khi s dng cc bin tnh: o Cp pht nh d, gy ra lng ph nh. o Cp pht nh thiu, chng trnh thc thi b li. trnh nhng hn ch trn, ngn ng C cung cp cho ta mt loi bin c bit gi l bin ng vi cc c im sau: o Ch pht sinh trong qu trnh thc hin chng trnh ch khng pht sinh lc bt u chng trnh. o Khi chy chng trnh, kch thc ca bin, vng nh v a ch vng nh c cp pht cho bin c th thay i. o Sau khi s dng xong c th gii phng tit kim ch trong b nh. Tuy nhin cc bin ng khng c a ch nht nh nn ta khng th truy cp n chng c. V th, ngn ng C li cung cp cho ta mt loi bin c bit na khc phc tnh trng ny, l bin con tr (pointer) vi cc c im: o Bin con tr khng cha d liu m ch cha a ch ca d liu hay cha a ch ca nh cha d liu. o Kch thc ca bin con tr khng ph thuc vo kiu d liu, lun c kch thc c nh l 2 byte.

II. KHAI BO V S DNG BIN CON TR


II.1. Khai bo bin con tr
C php: <Kiu> * <Tn con tr> ngha: Khai bo mt bin c tn l Tn con tr dng cha a ch ca cc bin c kiu Kiu. V d 1: Khai bo 2 bin a,b c kiu int v 2 bin pa, pb l 2 bin con tr kiu int. int a, b, *pa, *pb; V d 2: Khai bo bin f kiu float v bin pf l con tr float float f, *pf; Trang 81

Lp trnh cn bn Ghi ch: Nu cha mun khai bo kiu d liu m con tr ptr ang ch n, ta s dng: void *ptr; Sau , nu ta mun con tr ptr ch n kiu d liu g cng c. Tc dng ca khai bo ny l ch dnh ra 2 bytes trong b nh cp pht cho bin con tr ptr.

II.2. Cc thao tc trn con tr II.2.1 Gn a ch ca bin cho bin con tr


Ton t & dng nh v con tr n a ch ca mt bin ang lm vic. C php: <Tn bin con tr>=&<Tn bin> Gii thch: Ta gn a ch ca bin Tn bin cho con tr Tn bin con tr. V d: Gn a ch ca bin a cho con tr pa, gn a ch ca bin b cho con tr pb. pa=&a; pb=&b; Lc ny, hnh nh ca cc bin trong b nh c m t: a
pa pb 2 byte

b
2 byte

B nh

Lu : Khi gn a ch ca bin tnh cho con tr cn phi lu kiu d liu ca chng. V d sau y khng ng do khng tng thch kiu:
int Bien_Nguyen; float *Con_Tro_Thuc; ... Con_Tro_Thuc=&Bien_Nguyen;

Php gn y l sai v Con_Tro_Thuc l mt con tr kiu float (n ch c th cha c a ch ca bin kiu float); trong khi , Bien_Nguyen c kiu int.

II.2.2 Ni dung ca nh con tr ch ti


truy cp n ni dung ca nh m con tr ch ti, ta s dng c php: *<Tn bin con tr> Vi cch truy cp ny th *<Tn bin con tr> c th coi l mt bin c kiu c m t trong phn khai bo bin con tr. V d: V d sau y cho php khai bo, gn a ch cng nh ly ni dung vng nh ca bin con tr: int x=100; int *ptr; ptr=&x; int y= *ptr; Lu : Khi gn a ch ca mt bin cho mt bin con tr, mi s thay i trn ni dung nh con tr ch ti s lm gi tr ca bin thay i theo (thc cht ni dung nh v bin ch l mt). V d: on chng trnh sau thy r s thay i ny :
#include <stdio.h> #include <conio.h> int main() { int a,b,*pa,*pb; a=2; b=3;

Trang 82

Lp trnh cn bn
clrscr(); printf("\nGia tri cua bien a=%d \nGia tri cua bien b=%d ",a,b); pa=&a; pb=&b; printf("\nNoi dung cua o nho con tro pa tro toi=%d",*pa); printf("\nNoi dung cua o nho con tro pb tro toi=%d ",*pb); *pa=20; /* Thay i gi tr ca *pa*/ *pb=20; /* Thay i gi tr ca *pb*/ printf("\nGia tri moi cua bien a=%d \n Gia tri moi cua bien b=%d ",a,b); /* a, b thay i theo*/ getch(); return 0;

Kt qu thc hin chng trnh:

II.2.3 Cp pht vng nh cho bin con tr


Trc khi s dng bin con tr, ta nn cp pht vng nh cho bin con tr ny qun l a ch. Vic cp pht c thc hin nh cc hm malloc(), calloc() trong th vin alloc.h. C php cc hm: void *malloc(size_t size): Cp pht vng nh c kch thc l size. void *calloc(size_t nitems, size_t size): Cp pht vng nh c kch thc l nitems*size. V d: Gi s ta c khai bo: int a, *pa, *pb; pa = (int*)malloc(sizeof(int)); /* Cp pht vng nh c kch thc bng vi kch thc ca mt s nguyn */ pb= (int*)calloc(10, sizeof(int)); /* Cp pht vng nh c th cha c 10 s nguyn*/ Lc ny hnh nh trong b nh nh sau:
0 pa 2 byte pb 1 2 3 2 byte 4 5 6 7 8 9

Lu : Khi s dng hm malloc() hay calloc(), ta phi p kiu v nguyn mu cc hm ny tr v con tr kiu void.

II.2.4 Cp pht li vng nh cho bin con tr


Trong qu trnh thao tc trn bin con tr, nu ta cn cp pht thm vng nh c kch thc ln hn vng nh cp pht, ta s dng hm realloc(). C php: void *realloc(void *block, size_t size) ngha: - Cp pht li 1 vng nh cho con tr block qun l, vng nh ny c kch thc mi l size; khi cp pht li th ni dung vng nh trc vn tn ti.
Trang 83

Lp trnh cn bn

- Kt qu tr v ca hm l a ch u tin ca vng nh mi. a ch ny c th khc vi a ch c ch ra khi cp pht ban u. V d: Trong v d trn ta c th cp pht li vng nh do con tr pa qun l nh sau: int a, *pa; pa=(int*)malloc(sizeof(int)); /*Cp pht vng nh c kch thc 2 byte*/ pa = realloc(pa, 6); /* Cp pht li vng nh c kch thc 6 byte*/

II.2.5 Gii phng vng nh cho bin con tr


Mt vng nh cp pht cho bin con tr, khi khng cn s dng na, ta s thu hi li vng nh ny nh hm free(). C php: void free(void *block) ngha: Gii phng vng nh c qun l bi con tr block. V d: v d trn, sau khi thc hin xong, ta gii phng vng nh cho 2 bin con tr pa & pb: free(pa); free(pb);

II.2.6 Mt s php ton trn con tr


a. Php gn con tr: Hai con tr cng kiu c th gn cho nhau. V d:
int a, *p, *a ; float *f; a = 5 ; p = &a ; q = p ; /* ng */ f = p ; /* sai do khc kiu */

Ta cng c th p kiu con tr theo c php: (<Kiu kt qu>*)<Tn con tr> Chng hn, v d trn c vit li:
int a, *p, *a ; float *f; a = 5 ; p = &a ; q = p ; /* ng */ f = (float*)p; /* ng nh p kiu*/

b. Cng, tr con tr vi mt s nguyn Ta c th cng (+), tr (-) 1 con tr vi 1 s nguyn N no ; kt qu tr v l 1 con tr. Con tr ny ch n vng nh cch vng nh ca con tr hin ti N phn t. V d: Cho on chng trnh sau:
int *pa; pa = (int*) malloc(20); /* Cp pht vng nh 20 byte=10 s nguyn*/ int *pb, *pc; pb = pa + 7; pc = pb - 3;

Lc ny hnh nh ca pa, pb, pc nh sau: 0 1 2 3 4 pa pc

5 pb

c. Con tr NULL: l con tr khng cha a ch no c. Ta c th gn gi tr NULL cho 1 con tr c kiu bt k. d. Lu : - Ta khng th cng 2 con tr vi nhau.
Trang 84

Lp trnh cn bn

- Php tr 2 con tr cng kiu s tr v 1 gi tr nguyn (int). y chnh l khong cch (s phn t) gia 2 con tr . Chng hn, trong v d trn pc-pa=4.

III. CON TR V MNG


III.1 Con tr v mng 1 chiu
Gia mng v con tr c mt s lin h rt cht ch. Nhng phn t ca mng c th c xc nh bng ch s trong mng, bn cnh chng cng c th c xc lp qua bin con tr. III.1.1 Truy cp cc phn t mng theo dng con tr Ta c cc quy tc sau: &<Tn mng>[0] tng ng vi <Tn mng> &<Tn mng> [<V tr>] tng ng vi <Tn mng> + <V tr> <Tn mng>[<V tr>] tng ng vi *(<Tn mng> + <V tr>) V d: Cho 1 mng 1 chiu cc s nguyn a c 5 phn t, truy cp cc phn t theo kiu mng v theo kiu con tr.
#include <stdio.h> #include <conio.h> /* Nhp mng bnh thng*/ void NhapMang(int a[], int N){ int i; for(i=0;i<N;i++) { printf("Phan tu thu %d: ",i);scanf("%d",&a[i]); } } /* Nhp mng theo dng con tr*/ void NhapContro(int a[], int N) { int i; for(i=0;i<N;i++){ printf("Phan tu thu %d: ",i);scanf("%d",a+i); } } int main() { int a[20],N,i; clrscr(); printf("So phan tu N= ");scanf("%d",&N); NhapMang(a,N); /* NhapContro(a,N)*/ printf("Truy cap theo kieu mang: "); for(i=0;i<N;i++) printf("%d ",a[i]); printf("\nTruy cap theo kieu con tro: "); for(i=0;i<N;i++) printf("%d ",*(a+i)); getch(); return 0; }

Kt qu thc thi ca chng trnh:

Trang 85

Lp trnh cn bn

III.1.2 Truy xut tng phn t ang c qun l bi con tr theo dng mng <Tn bin>[<V tr>] tng ng vi *(<Tn bin> + <V tr>) &<Tn bin>[<V tr>] tng ng vi (<Tn bin> + <V tr>) Trong <Tn bin> l bin con tr, <V tr> l 1 biu thc s nguyn. V d: Gi s c khai bo:
#include <stdio.h> #include <alloc.h> #include <conio.h> int main(){ int *a; int i; clrscr(); a=(int*)malloc(sizeof(int)*10); for(i=0;i<10;i++) a[i] = 2*i; printf("Truy cap theo kieu mang: "); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\nTruy cap theo kieu con tro: "); for(i=0;i<10;i++) printf("%d ",*(a+i)); getch(); return 0; }

Kt qu chng trnh:

Vi khai bo trn, hnh nh ca con tr a trong b nh:


0 0 a 1 2 2 4 3 4 6 8 2 byte 5 6 7 8 9 10 12 14 16 18

III.1.3 Con tr ch n phn t mng Gi s con tr ptr ch n phn t a[i] no ca mng a th: ptr + j ch n phn t th j sau a[i], tc a[i+j] ptr - j ch n phn t ng trc a[i], tc a[i-j] V d: Gi s c 1 mng mang_int, cho con tr contro_int ch n phn t th 5 trong mng. In ra cc phn t ca contro_int & mang_int.
#include <stdio.h>

Trang 86

Lp trnh cn bn
#include <conio.h> #include <alloc.h> int main() { int i,mang_int[10]; int *contro_int; clrscr(); for(i=0;i<=9;i++) mang_int[i]=i*2; contro_int=&mang_int[5]; printf("\nNoi dung cua mang_int ban dau="); for (i=0;i<=9;i++) printf("%d ",mang_int[i]); printf("\nNoi dung cua contro_int ban dau ="); for (i=0;i<5;i++) printf("%d ",contro_int[i]); for(i=0;i<5;i++) contro_int[i]++; printf("\n--------------------------------------------------------"); printf("\nNoi dung cua mang_int sau khi tang 1="); for (i=0;i<=9;i++) printf("%d ",mang_int[i]); printf("\nNoi dung cua contro_int sau khi tang 1="); for (i=0;i<5;i++) printf("%d ",contro_int[i]); if (contro_int!=NULL) free(contro_int); getch(); return 0; }

Kt qu chng trnh

III.2 Con tr v mng nhiu chiu


Ta c th s dng con tr thay cho mng nhiu chiu nh sau: Gi s ta c mng 2 chiu v bin con tr nh sau: int a[n][m]; int *contro_int; Thc hin php gn contro_int=a; Khi phn t a[0][0] c qun l bi contro_int; a[0][1] c qun l bi contro_int+1; a[0][2] c qun l bi contro_int+2; ... a[1][0] c qun l bi contro_int+m; a[1][1] c qun l bi contro_int+m+1; ... a[n][m] c qun l bi contro_int+n*m;

Tng t nh th i vi mng nhiu hn 2 chiu.

Trang 87

Lp trnh cn bn

V d: S tng ng gia mng 2 chiu v con tr.


#include <stdio.h> #include <conio.h> #include <alloc.h> int main() { int i,j; int mang_int[4][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14, 15,16,17,18,19,20}; int *contro_int; clrscr(); contro_int=(int*)mang_int; printf("\nNoi dung cua mang_int ban dau="); for (i=0;i<4;i++) { printf("\n"); for (j=0;j<5;j++) printf("%d\t",mang_int[i][j]); } printf("\n---------------------------------"); printf("\nNoi dung cua contro_int ban dau \n"); for (i=0;i<20;i++) printf("%d ",contro_int[i]); for(i=0;i<20;i++) contro_int[i]++ ; printf("\n--------------------------------------------------------"); printf("\nNoi dung cua mang_int sau khi tang 1="); for (i=0;i<4;i++) { printf("\n"); for (j=0;j<5;j++) printf("%d\t",mang_int[i][j]); } printf("\nNoi dung cua contro_int sau khi tang 1=\n"); for (i=0;i<20;i++) printf("%d ",contro_int[i]); if (contro_int!=NULL) free(contro_int); getch(); return 0;

Kt qu thc hin chng trnh nh sau:

Trang 88

Lp trnh cn bn

IV. CON TR V THAM S HNH THC CA HM


Khi tham s hnh thc ca hm l mt con tr th theo nguyn tc gi hm ta dng tham s thc t l 1 con tr c kiu ging vi kiu ca tham s hnh thc. Nu lc thc thi hm ta c s thay i trn ni dung vng nh c ch bi con tr tham s hnh thc th lc ni dung vng nh c ch bi tham s thc t cng s b thay i theo. V d : Xt hm hon v c vit nh sau :
#include<stdio.h> #include<conio.h> void HoanVi(int *a, int *b) { int c=*a; *a=*b; *b=c; } int main() { int m=20,n=30; clrscr(); printf("Truoc khi goi ham m= %d, n= %d\n",m,n); HoanVi(&m,&n); printf("Sau khi goi ham m= %d, n= %d",m,n); getch(); return 0; }

Kt qu thc thi chng trnh:

Trc khi gi hm

Khi gi hm Sau khi gi hm: a=&m; b= &n; Con tr a, b b gii phng Lc ny : *a=m; *b=n; m, n thay i: m=30 n=20

m=20

n=30

m=20

n=30

&m

&n

i ch ta c : a b *a=m=30; *b=n=20;

&m

&n

m=30

n=20

&m

&n Trang 89

Lp trnh cn bn

V. BI TP V.1 Mc tiu
Tip cn vi mt kiu d liu rt mnh trong C l kiu con tr. T , sinh vin c th xy dng cc ng dng bng cch s dng cp pht ng thng qua bin con tr.

V.2 Ni dung
Thc hin cc bi tp chng trc (chng VI : Kiu mng) bng cch s dng con tr.

Trang 90

You might also like