intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Báo cáo khoa học: "một số ứng dụng của con trỏ trong c và C++"

Chia sẻ: Nguyễn Phương Hà Linh Nguyễn Phương Hà Linh | Ngày: | Loại File: PDF | Số trang:5

126
lượt xem
22
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bài báo này trình bầy một số ứng dụng của con trỏ trong các vấn đề quan trọng và lý thú sau đây của C/C++: + Xây dựng hàm với số đối bất định + Xây dựng toán tử gán cho lớp dẫn xuất + Sử dụng hiệu quả các vùng nhớ...

Chủ đề:
Lưu

Nội dung Text: Báo cáo khoa học: "một số ứng dụng của con trỏ trong c và C++"

  1. mét sè øng dông cña con trá trong c vμ C++ PGS. TS. Ph¹m v¨n Êt Khoa C«ng nghÖ th«ng tin - Tr−êng §H GTVT Tãm t¾t: Bμi b¸o nμy tr×nh bÇy mét sè øng dông cña con trá trong c¸c vÊn ®Ò quan träng vμ lý thó sau ®©y cña C/C++: + X©y dùng hμm víi sè ®èi bÊt ®Þnh + X©y dùng to¸n tö g¸n cho líp dÉn xuÊt + Sö dông hiÖu qu¶ c¸c vïng nhí Summary: In this paper, we will present some applications of the pointer in the important and interesting problems of C/C++ such as: + Creating functions with variable argument lists. + Creating assignment operator for derived classes. + Using the memories efficiently tham sè cè ®Þnh. 1. Hμm víi ®èi sè bÊt ®Þnh C¸c ®èi bÊt ®Þnh ®−îc khai b¸o bëi ba dÊu chÊm: bÊt ®Þnh c¶ vÒ sè l−îng vµ kiÓu. Nh− ®· biÕt, trong c¸c gi¸o tr×nh C/C++ C¸c tham sè bÊt ®Þnh (øng víi c¸c ®èi bÊt th−êng chØ h−íng dÉn c¸ch x©y dùng hµm víi ®Þnh) lµ mét danh s¸ch gi¸ trÞ víi sè l−îng vµ mét sè cè ®Þnh c¸c ®èi. Mçi ®èi cÇn cã mét kiÓu tuú ý (kh«ng x¸c ®Þnh). tham sè (cïng kiÓu víi nã) trong lêi gäi hµm. Tuy nhiªn mét vµi hµm chuÈn cña C l¹i kh«ng Trong c¸c môc 2 - 5 d−íi ®©y sÏ tr×nh bÇy nh− vËy, mµ linh ho¹t h¬n, ch¼ng h¹n khi c¸ch x©y dùng c¸c hµm víi ®èi sè bÊt ®Þnh. dïng hµm printf hay scanf th× sè tham sè mµ C«ng cô chñ yÕu ®−îc dïng lµ con trá vµ ta cung cÊp cho hµm lµ kh«ng cè ®Þnh c¶ vÒ danh s¸ch. sè l−îng lÉn kiÓu c¸ch. VÝ dô trong c©u lÖnh: printf(“\n Tæng = %d “ , 3+4+5); ii. BiÕn con trá cã 2 tham sè, nh−ng trong c©u lÖnh: BiÕn con trá (hay con trá) dïng ®Ó chøa printf(“\n Hµ Néi“); ®Þa chØ cña biÕn, m¶ng, hµm, ... Cã nhiÒu kiÓu ®Þa chØ, v× vËy còng cã nhiÒu kiÓu con trá. BiÕn chØ cã mét tham sè. con trá ®−îc khai b¸o theo mÉu: Nh− vËy cÇn ph©n biÖt c¸c kh¸i niÖm KiÓu *Tªn_biÕn_con_trá ; sau: VÝ dô: §èi sè cè ®Þnh ®−îc khai b¸o trong dßng ®Çu cña hµm, nã cã tªn vµ kiÓu. float *px ; /* px lµ con trá thùc */ Tham sè øng víi ®èi sè cè ®Þnh gäi lµ C¸c phÐp to¸n quan träng trªn con trá
  2. gåm: list = malloc(sizeof(int) + sizeof(float) + + sizef(char*) ); + G¸n ®Þa chØ mét vïng nhí cho con trá (dïng to¸n tö g¸n, phÐp lÊy ®Þa chØ, c¸c plist; hµm cÊp ph¸t bé nhí). *(int*)p) = 12; /* §−a sè nguyªn 12 vµo danh s¸ch */ + Truy nhËp vµo vïng nhí mµ ®Þa chØ cña nã chøa trong con trá, dïng phÐp to¸n: ((int*)p)++ ; /* ChuyÓn sang phÇn tö tiÕp theo */ *Tªn_con_trá *((float*)p) = 3.14; /* §−a sè thùc 3.14 (§Ó ý ë ®©y cã 2 vïng nhí: Vïng nhí cña vµo danh s¸ch */ biÕn con trá vµ vïng nhí mµ ®Þa chØ ®Çu cña ((float*)p)++ ; /* ChuyÓn sang phÇn nã chøa trong biÕn con trá). tö tiÕp theo */ + Céng ®Þa chØ ®Ó con trá chøa ®Þa chØ *((char**)p) = “HA NOI”; /* §−a ®Þa chØ cña phÇn tö tiÕp theo, dïng phÐp to¸n: chuçi “HA NOI” vµo danh s¸ch */ ++ Tªn_con_trá hoÆc Tªn_con_trá ++ /* NhËn c¸c phÇn tö cña danh s¸ch */ p=list; /* VÒ ®Çu danh s¸ch */ Chó ý r»ng c¸c phÐp to¸n trªn chØ cã thÓ int a = *((int*)p); /* NhËn phÇn tö thø thùc hiÖn ®èi víi con trá cã kiÓu. nhÊt */ ((int*)p)++ ; /* ChuyÓn sang phÇn tö iii. Danh s¸ch kh«ng cïng kiÓu tiÕp theo */ Dïng con trá cã kiÓu chØ qu¶n lý ®−îc float x= *((float*)p); /* NhËn phÇn tö thø danh s¸ch c¸c gi¸ trÞ cïng kiÓu, vÝ dô dÉy sè hai */ thùc, dÉy sè nguyªn, dÉy c¸c cÊu tróc,.... ((float*)p)++ ; /* ChuyÓn sang phÇn tö Khi cÇn qu¶n lý mét danh s¸ch c¸c gi¸ trÞ tiÕp theo */ kh«ng cïng kiÓu ta ph¶i dïng con trá kh«ng char *str = *((char**)p) ; /* NhËn phÇn kiÓu (con trá void) khai b¸o nh− sau: tö thø ba */ void * Tªn_con_trá ; iv. Hμm víi ®èi sè bÊt ®Þnh Con trá void cã thÓ chøa c¸c ®Þa chØ cã kiÓu bÊt kú, vµ dïng ®Ó trá ®Õn vïng nhí chøa + C¸c ®èi bÊt ®Þnh bao giê còng ®Æt sau danh s¸ch cÇn qu¶n lý. Mét chó ý quan träng cïng vµ ®−îc khai b¸o b»ng 3 dÊu chÊm. VÝ lµ mçi khi göi vµo hay lÊy ra mét gi¸ trÞ tõ dô hµm: vïng nhí, th× tuú theo kiÓu gi¸ trÞ mµ ta ph¶i void f(int n, char *s, ...) ; dïng phÐp chuyÓn kiÓu thÝch hîp ®èi víi con trá. VÝ dô sau minh ho¹ c¸ch lËp mét danh cã 2 ®èi cè ®Þnh lµ n, s vµ c¸c ®èi bÊt ®Þnh. s¸ch gåm mét sè nguyªn, mét sè thùc vµ mét + §Ó nhËn ®−îc c¸c tham sè bÊt ®Þnh chuçi ký tù. Chóng ta cÇn mét bé nhí ®Ó chøa trong lêi gäi hµm ta cÇn l−u ý c¸c ®iÓm sau: sè nguyªn, sè thùc vµ ®Þa chØ chuçi vµ dïng - C¸c tham sè bÊt ®Þnh chøa trong mét c¸c con trá void ®Ó qu¶n lý vïng nhí nµy. danh s¸ch. §Ó nhËn ®−îc ®Þa chØ ®Çu danh void *list , *p ; /* Con trá list trá tíi ®Çu s¸ch ta dïng mét con trá void vµ phÐp g¸n danh s¸ch */ sau: /* p dïng ®Ó duyÖt qua c¸c phÇn tö cña void *list ; danh s¸ch */
  3. list = ... ; int n,i ; char kieu; - Dïng mét tham sè cè ®Þnh kiÓu chuçi int lap; ®Ó quy ®Þnh sè l−îng vµ kiÓu cña mçi tham sè bÊt ®Þnh trong danh s¸ch, vÝ dô: list = ... ; /* list trá tíi vïng nhí chøa danh s¸ch ®Þa chØ c¸c tham sè */ “3i” hiÓu lµ: danh s¸ch gåm 3 tham sè lap = isdigit(st[0]) ; kiÓu int. if (lap) “5f” hiÓu lµ: danh s¸ch gåm 5 tham sè n=st[0] - '0' ; kiÓu float. else “fissif” hiÓu lµ: danh s¸ch gåm 6 tham sè n=strlen(st); cã kiÓu lÇn l−ît lµ float, int, char*, char*, int vµ for(i=0;i
  4. float *max, *min , tg; } int i; void main() max = *((float**)lt)++; { min = *((float**)lt)++; float x=3.14; *max = *min = (float) *((double*)lt)++; int a=123, b=456, c=789; char *tp="NHA TRANG"; for(i=1;i *max) *max = tg; InDanhSachGiaTri("ifsssffii",a,x,tp,tp," if(tg < *min) *min = tg; QUY NHON",x,6.28,a,246); } InDanhSachGiaTri("2f",6.28,x); } getch(); Sö dông hμm: §Ó tÝnh max vµ min cña } c¸c gi¸ trÞ thùc x, y, z ta dïng c¸c c©u lÖnh: float smax, smin ; /* Dïng ®Ó chøa c¸c v. Hμm kh«ng ®èi vμ hμm víi ®èi bÊt gi¸ trÞ max vµ min */ ®Þnh N = 3; /* Sè gi¸ trÞ cÇn tÝnh max, min lµ 3 */ NhiÒu ng−êi nghÜ hµm khai b¸o nh− sau: maxmin(&smax, &smin, x, y, z) ; /* Lêi void f(); gäi hµm */ lµ hµm kh«ng ®èi trong C. Trong C++ th× hiÓu nh− thÕ lµ ®óng, cßn trong C th× ®ã lµ hµm cã vi. c¸ch x©y dùng to¸n tö g¸n ®èi bÊt ®Þnh (hµm kh«ng ®èi trong C khai b¸o trong líp dÉn xuÊt nh− sau: f(void) ). Do kh«ng cã ®èi cè ®Þnh nµo cho biÕt vÒ sè l−îng vµ kiÓu cña c¸c tham Tr−íc hÕt cÇn x©y dùng to¸n tö g¸n cho sè bÊt ®Þnh, nªn gi¶i ph¸p ë ®©y lµ dïng c¸c líp c¬ së (gäi lµ líp A), sau ®ã ®Ó x©y dùng biÕn toµn bé. Râ rµng gi¶i ph¸p nµy kh«ng to¸n tö g¸n cho líp dÉn xuÊt (líp B), cã thÓ thuËn tiÖn cho ng−êi dïng v× ph¶i khai b¸o tiÕn hµnh theo 2 b−íc: ®óng tªn biÕn toµn bé vµ ph¶i khëi g¸n gi¸ trÞ B−íc 1: Sö dông phÐp g¸n cña líp c¬ së cho nã tr−íc khi gäi hµm. VÝ dô sau tr×nh bÇy A ®Ó thùc hiÖn viÖc g¸n trªn c¸c thuéc tÝnh mét hµm chØ cã ®èi bÊt ®Þnh dïng ®Ó tÝnh max thõa kÕ. Muèn vËy cÇn sö dông con trá this vµ min cña c¸c gi¸ trÞ thùc. C¸c tham sè bÊt cña líp B vµ Ðp kiÓu theo A ®Ó nhËn ®−îc mét ®Þnh ®−îc ®−a vµo theo tr×nh tù sau: §Þa chØ ®èi t−îng kiÓu A. §iÒu nµy ®−îc thùc hiÖn chøa max, ®Þa chØ chøa min, c¸c gi¸ trÞ thùc theo mÉu: cÇn tÝnh max, min. Ch−¬ng tr×nh dïng biÕn toµn bé N ®Ó cho biÕt sè gi¸ trÞ thùc cÇn tÝnh A *p ; max, min. p = (A*)this ; int N; *p = A::operator=(b) ; void maxmin() { ë ®©y b (cã kiÓu B) lµ ®èi cña to¸n tö g¸n cña void *lt = ... ; líp B.
  5. NhËn xÐt: Cã thÓ thay 3 c©u lÖnh trªn vii. Truy nhËp linh ho¹t tíi c¸c b»ng mét c©u lÖnh sau: vïng nhí *(A*)this = A::operator=(b) ; §Ó truy nhËp tíi mét vïng nhí cã ®é lín tuú ý (gi¶ sö 1000 byte), ®Çu tiªn cÇn ®Þnh B−íc 2: Thùc hiÖn phÐp g¸n trªn c¸c nghÜa mét kiÓu con trá 1000 byte theo mÉu: thuéc tÝnh cña líp dÉn xuÊt. typedef struct Sau ®©y lµ vÝ dô minh ho¹: { class A char M[1000] ; { } *MEM ; private: char *strA; Sau ®ã dïng kiÓu MEM ®Ó truy nhËp tíi c¸c vïng nhí 1000 byte. VÝ dô sau minh ho¹ public: c¸ch g¸n 2 hµng cña ma trËn chøa trong const A & operator = (const A & a) m¶ng 2 chiÒu: { typedef struct if(this->strA!=NULL) { delete this->strA; this->strA= strdup(a.strA); float M[100] ; return a; } *MEM ; } float a[100][100] , tg[100]; }; *(MEM)tg = *(MEM)(a+i) ; /* G¸n class B : public A hµng i vµo tg */ { *(MEM)(a+i) = *(MEM)(a+j) ; /* G¸n private: hµng j vµo hµng i */ char *strB; *(MEM)(a+j) = *(MEM)tg ; /* G¸n tg vµo hµng j */ public: const B & operator = (const B & b) viii. KÕt luËn { Con trá trong C/C++ lµ mét c«ng cô // G¸n c¸c thuéc tÝnh thõa m¹nh mÏ vµ linh ho¹t. §Ó n©ng cao kü thuËt kÕ tõ A lËp tr×nh C/C++ cÇn biÕt c¸ch sö dông con trá, *(A*)this = A::operator=(b) ; c¸c vÝ dô trªn ®· minh ho¹ ®iÒu nµy. // G¸n c¸c thuéc tÝnh cña B if(this->strB!=NULL) Tµi liÖu tham kh¶o delete this->strB; [1]. Peter Norton. Advanced C Programming. Brady this->strB = strdup( b.strB); Publishing, 1992. return b; [2]. Ph¹m V¨n Êt. Kü thuËt lËp tr×nh C c¬ së vµ n©ng } cao. NXB Khoa häc vµ Kü thuËt, Hµ Néi, 1999. }; [3]. Ph¹m V¨n Êt. C++ vµ lËp tr×nh h−íng ®èi t−îng. NXB Khoa häc vµ Kü thuËt, Hµ Néi, 2000
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2