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

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: Bi báo ny 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 hm 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
1. Hm với đối số bất định
Nh đã biết, trong các giáo trình C/C++
thờng chỉ hớng dẫn cách xây dựng hàm với
một số cố định các đối. Mỗi đối cần có một
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
nh vậy, mà linh hoạt hơn, chẳng hạn khi
dùng hàm printf hay scanf thì số tham số mà
ta cung cấp cho hàm là không cố định cả về
số lợng lẫn kiểu cách. Ví dụ trong câu lệnh:
printf(\n Tổng = %d , 3+4+5);
có 2 tham số, nhng trong câu lệnh:
printf(\n Hà Nội);
chỉ có một tham số.

của nó chứa trong con trỏ, dùng phép toán:
*Tên_con_trỏ
(Để ý ở đây có 2 vùng nhớ: Vùng nhớ của
biến con trỏ và vùng nhớ mà địa chỉ đầu của
nó chứa trong biến con trỏ).
+ Cộng địa chỉ để con trỏ chứa địa chỉ
của phần tử tiếp theo, dùng phép toán:
++ Tên_con_trỏ hoặc Tên_con_trỏ ++
Chú ý rằng các phép toán trên chỉ có thể
thực hiện đối với con trỏ có kiểu.
iii. Danh sách không cùng kiểu
Dùng con trỏ có kiểu chỉ quản lý đợc
danh sách các giá trị cùng kiểu, ví dụ dẫy số
thực, dẫy số nguyên, dẫy các cấu trúc,
Khi cần quản lý một danh sách các giá trị
không cùng kiểu ta phải dùng con trỏ không
kiểu (con trỏ void) khai báo nh sau:
void * Tên_con_trỏ ;
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
danh sách cần quản lý. Một chú ý quan trọng
là mỗi khi gửi vào hay lấy ra một giá trị từ
vùng nhớ, thì tuỳ theo kiểu giá trị mà ta phải
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
sách gồm một số nguyên, một số thực và một
chuỗi ký tự. Chúng ta cần một bộ nhớ để chứa
số nguyên, số thực và địa chỉ chuỗi và dùng
các con trỏ void để quản lý vùng nhớ này.
void *list , *p ; /* Con trỏ list trỏ tới đầu

+ Các đối bất định bao giờ cũng đặt sau
cùng và đợc khai báo bằng 3 dấu chấm. Ví
dụ hàm:
void f(int n, char *s, ) ;
có 2 đối cố định là n, s và các đối bất định.
+ Để nhận đợc các tham số bất định
trong lời gọi hàm ta cần lu ý các điểm sau:
- Các tham số bất định chứa trong một
danh sách. Để nhận đợc địa chỉ đầu danh
sách ta dùng một con trỏ void và phép gán
sau:
void *list ;

list = ;
- Dùng một tham số cố định kiểu chuỗi
để quy định số lợng và kiểu của mỗi tham số
bất định trong danh sách, ví dụ:
3i hiểu là: danh sách gồm 3 tham số
kiểu int.
5f hiểu là: danh sách gồm 5 tham số
kiểu float.
fissif hiểu là: danh sách gồm 6 tham số
có kiểu lần lợt là float, int, char*, char*, int và
float.
Một khi đã biết đợc địa chỉ đầu danh
sách, biết đợc số lợng và kiểu của mỗi tham
số, thì dễ dàng nhận đợc giá trị các tham số
để sử dụng trong thân hàm.
Ví dụ sau đây minh hoạ cách xây dựng
và sử dụng các hàm với tham số bất định.

n=st[0] - '0' ;
else
n=strlen(st);
for(i=0;i<n;++i)
{
if(lap)
kieu=st[1];
else
kieu = st[i];
switch(kieu)
{
case 'i' :
gt_int = *((int*)list);
((int*)list)++ ;
printf("\nGia tri %d =
%d",i,gt_int);
break;
case 'f' :
gt_float = (float)
(*((double*)list));
((double*)list)++ ;
printf("\nGia tri %d =
%0.2f",i,gt_float);
break;
case 's' :
gt_str = *((char**)list) ;
((char**)list)++ ;
printf("\nGia tri %d =
%s",i,gt_str);
}

một hàm chỉ có đối bất định dùng để tính max
và min của các giá trị thực. Các tham số bất
định đợc đa vào theo trình tự sau: Địa chỉ
chứa max, địa chỉ chứa min, các giá trị thực
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
max, min.
int N;
void maxmin()
{
void *lt = ;
float *max, *min , tg;
int i;
max = *((float**)lt)++;
min = *((float**)lt)++;
*max = *min = (float) *((double*)lt)++;

for(i=1;i<N;++i)
{
tg= (float) *((double*)lt)++;
if(tg > *max) *max = tg;
if(tg < *min) *min = tg;
}
}
Sử dụng hm: Để 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
giá trị max và min */
N = 3; /* Số giá trị cần tính
max, min là 3 */

public:
const A & operator = (const A & a)
{
if(this->strA!=NULL)
delete this->strA;
this->strA= strdup(a.strA);
return a;
}
} ;
class B : public A
{
private:
char *strB;
public:
const B & operator = (const
B & b)
{
// Gán các thuộc tính thừa
kế từ A
*(A*)this = A::operator=(b) ;
// Gán các thuộc tính của B
if(this->strB!=NULL)
delete this->strB;
this->strB = strdup( b.strB);
return b;
}
} ;
vii. Truy nhập linh hoạt tới các
vùng nhớ
Để truy nhập tới một vùng nhớ có độ lớn

[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Ă


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status