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
lượt xem 23
download
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ớ...
Bình luận(0) Đăng nhập để gửi bình luận!
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++"
- 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á
- 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 */
- 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
- 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.
- 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
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Báo cáo khoa học: Nghiên cứu sản xuất sử dụng thuốc sâu sinh học đa chức năng cho một số loại cây trồng bằng kỹ thuật công nghệ sinh học
173 p | 605 | 103
-
Báo cáo khoa học: Nghiên cứu áp dụng công nghệ phôi vô tính, hạt nhân tạo trong nhân nhanh một số cây có giá trị kinh tế
557 p | 260 | 62
-
Báo cáo khoa học: Một số lưu ý khi sử dụng MS project 2007 trong lập tiến độ và quản lý dự án xây dựng
6 p | 236 | 48
-
Báo cáo khoa học: "MỘT SỐ ĐÓNG GÓP NHẰM NÂNG CAO KỸ NĂNG NGHE - NÓI NHANH TIẾNG ANH CHO SINH VIÊN TRƯỜNG ĐẠI HỌC GTVT - CƠ SỞ II"
5 p | 157 | 26
-
Báo cáo khoa học: Một số ví dụ về cách dùng hình ảnh và con số trong thành ngữ tiếng Việt, tiếng Pháp và tiếng Anh
7 p | 175 | 21
-
Báo cáo khoa học: "Một số đặc điểm hình thái và hoá sinh của các giống bưởi trồng tại tỉnh Nghệ An và Hà Tĩnh."
8 p | 111 | 19
-
Báo cáo khoa học: "MỘT SỐ GIẢI PHÁP THU HỒI CÔNG NỢ PHẢI THU TRONG CÁC DOANH NGHIỆP XÂY DỰNG GIAO THÔNG"
6 p | 174 | 19
-
Báo cáo khoa học: "MỘT SỐ TRƯỜNG HỢP TÍNH TOÁN NHANH CÁC CHỈ TIÊU HIỆU QUẢ CỦA DỰ ÁN ĐẦU TƯ"
4 p | 111 | 17
-
Báo cáo khoa học: "Một số tính chất của họ CF và cs-ánh xạ phủ compac"
10 p | 136 | 16
-
Báo cáo khoa học: Một số phương pháp hiệu chỉnh góc nghiêng của ảnh và ứng dụng
10 p | 157 | 13
-
Báo cáo khoa học: Một số phương pháp tính chuyển tọa độ trong khảo sát thủy đạc hiện nay đang áp dụng ở Việt Nam
7 p | 130 | 9
-
Báo cáo khoa học: Một số phép biến đổi bảo toàn cạnh và góc của tam giác
20 p | 92 | 9
-
Báo cáo khoa học: Lập chỉ mục theo nhóm để nâng cao hiệu quả khai thác cơ sở dữ liệu virus cúm
10 p | 162 | 8
-
Báo cáo nghiên cứu khoa học: " Một số kết quả điều tra bước đầu hệ thực vật vùng Đông Bắc núi Hồng Lĩnh - huyện Nghi Xuân - tỉnh Hà Tĩnh"
8 p | 86 | 6
-
Báo cáo nghiên cứu khoa học: "Một số tính chất của phân thớ con Lagrăng của phân thớ vectơ symplectic"
5 p | 87 | 5
-
Báo cáo khoa học: Tìm hiểu một số đặc điểm điện sinh lý nhĩ trái ở bệnh nhân rung nhĩ bằng hệ thống lập bản đồ ba chiều
33 p | 7 | 4
-
Báo cáo khoa học: Kỹ thuật chụp cộng hưởng từ sọ não trong chẩn đoán nhồi máu não trên máy cộng hưởng từ 1.5 TESLA.
30 p | 27 | 4
-
Báo cáo khoa học: Một số nhiễu ảnh thường gặp trong chụp cộng hưởng từ và cách khắc phục
15 p | 17 | 4
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn