Updatesofts.com Ebooks Team
Trang 64
g = (*functocall)(x,y);
return (g);
}
int main ()
{
int m,n;
m = operation (7, 5, &addition);
n = operation (20, m, minus);
cout <<n;
return 0;
}
Trong ví d này,
minus
là mt con tr toàn cc tr ti mt hàm có hai tham s kiu
int
,
con tr này ñược gám ñể tr ti hàm
subtraction
, tt c ñều trên mt dòng:
int (* minus)(int,int) = subtraction;
Updatesofts.com Ebooks Team
Trang 65
B nh ñộng
Cho ñến nay, trong các chương trình ca chúng ta, tt c nhng phn b nh chúng ta có
th s dng là các biến các mng và các ñối tượng khác mà chúng ta ñã khai báo. Kích c
ca chúng là c ñịnh và không th thay ñổi trong thi gian chương trình chy. Nhưng nếu
chúng ta cn mt lượng b nh mà kích c ca nó ch có th ñược xác ñịnh khi chương
trình chy, ví d như trong trường hp chúng ta nhn thông tin t người dùng ñể xác ñịnh
lượng b nh cn thiết.
Gii pháp ñây chính là b nh ñộng, C++ ñã tích hp hai toán t new delete ñể thc
hin vic này
Hai toán t newdelete ch có trong C++. phn sau ca bài chúng ta s
biết nhng thao tác tương ñương vi các toán t này trong C.
Toán t newnew[ ]
ðể có thñược b nh ñộng chúng ta có th dùng toán t new. Theo sau toán ty
là tên kiu d liu và có th là s phn t cn thiết ñược ñặt trong cp ngoc vuông. Nó
tr v mt con tr tr ti ñầu ca khi nh va ñược cp phát. Dng thc ca toán t này
như sau:
pointer = new type
hoc
pointer = new type [elements]
Biu thc ñầu tien ñược dùng ñể cp phát b nh cha mt phn t có kiu type. Lnh
th hai ñược dùng ñể cp phát mt khi nh (mt mng) gm các phn t kiu type.
Ví d:
int * bobby;
bobby = new int [5];
trong trường hp này, h ñiu hành dành ch cho 5 phn t kiu
int
trong b nh và tr
v mt con tr tr ñến ñầu ca khi nh. Vì vy lúc này
bobby
tr ñến mt khi nh hp
l gm 5 phn t
int
.
Bn có th hi tôi là có gì khác nhau gia vic khai báo mt mng vi vic cp phát b
nh cho mt con tr như chúng ta va làm. ðiu quan trng nht là kích thước ca mt
Updatesofts.com Ebooks Team
Trang 66
mng phi là mt hng, ñiu này gii hn kích thước ca mng ñến kích thước mà chúng
ta chn khi thiết kế chương trình trong khi ñó cp phát b nh ñộng cho phép cp phát b
nh trong quá trình chy vi kích thước bt kì.
B nh ñộng nói chung ñược qun lí bi h ñiu hành và trong các môi trường ña nhim
có th chy mt lúc vài chương trình có mt kh năng có th xy ra là hết b nh ñể cp
phát. Nếu ñiu này xy ra và h ñiu hành không th cp phát b nh như chúng ta yêu
cu vi toán t
new
, mt con tr null (zero) s ñược tr v. Vì vy các bn nên kim tra
xem con tr tr v bi toán t
new
có bng null hay không:
int * bobby;
bobby = new int [5];
if (bobby == NULL) {
// error assigning memory. Take measures.
};
Toán t delete.
Vì b nh ñộng ch cn thiết trong mt khong thi gian nht ñịnh, khi nó không cn
dùng ñến na thì nó s ñược gii phóng ñể có th cp phát cho các nhu cu khác trong
tương lai. ðể thc hin vic này ta dùng toán t
delete
, dng thc ca nó như sau:
delete pointer;
hoc
delete [] pointer;
Biu thc ñầu tiên nên ñược dùng ñể gii phóng b nh ñược cp phát cho mt phn t
và lnh th hai dùng ñể gii phóng mt khi nh gm nhiu phn t (mng). Trong hu
hết các trình dch c hai biu thc là tương ñương mc dù chúng là rõ ràng là hai toán t
khác nhau.
// rememb-o-matic
#include <iostream.h>
#include <stdlib.h>
int main ()
{
char input [100];
int i,n;
long * l, total = 0;
cout << "How many numbers do you
want to type in? ";
cin.getline (input,100); i=atoi
(input);
l= new long[i];
if (l == NULL) exit (1);
for (n=0; n<i; n++)
{
cout << "Enter number: ";
cin.getline (input,100);
l[n]=atol (input);
}
How many numbers do you want to
type in? 5
Enter number : 75
Enter number : 436
Enter number : 1067
Enter number : 8
Enter number : 32
You have entered: 75, 436, 1067, 8,
32,
Updatesofts.com Ebooks Team
Trang 67
cout << "You have entered: ";
for (n=0; n<i; n++)
cout << l[n] << ", ";
delete[] l;
return 0;
}
NULL
là mt hng s ñược ñịnh nghĩa trong thư vin C++ dùng ñể biu th con tr null.
Trong trường hp hng s này chưa ñịnh nghĩa bn có th t ñịnh nghĩa nó:
#define NULL 0
Dùng 0 hay
NULL
khi kim tra con tr là như nhau nhưng vic dùng
NULL
vi con tr
ñược s dng rt rng rãi và ñiu này ñược khuyến khích ñể giúp cho chương trình d
ñọc hơn.
B nh ñộng trong ANSI-C
Toán t newdeleteñộc quyn C++ và chúng không có trong ngôn ng C. Trong
ngôn ng C, ñể có th s dng b nh ñng chúng ta phi s dng thư vin
stdlib.h
.
Chúng ta s xem xét cách này vì nó cũng hp l trong C++ và nó vn còn ñược s dng
trong mt s chương trình.
Hàm malloc
ðây là mt hàm tng quát ñể cp phát b nh ñộng cho con tr. Cu trúc ca nó như sau:
void * malloc (size_t nbytes);
trong ñó
nbytes
là s byte chúng ta mun gán cho con tr. Hàm này tr v mt con tr
kiu
void*
, vì vy chúng ta phi chuyn ñổi kiu sang kiu ca con tr ñích, ví d:
char * ronny;
ronny = (char *) malloc (10);
ðon mã này cp phát cho con tr
ronny
mt khi nh 10 byte. Khi chúng ta mun cp
phát mt khi d liu có kiu khác char (ln hơn 1 byte) chúng ta phi nhân s phn t
mong mun vi kích thước ca chúng. Tht may mn là chúng ta có toán t
sizeof
, toán
t này tr v kích thước ca mt kiu d liu c th.
int * bobby;
bobby = (int *) malloc (5 * sizeof(int));
ðon mã này cp phát cho
bobby
mt khi nh gm 5 s nguyên kiu int, kích c ca
kiu d liu này có th bng 2, 4 hay hơn tùy thuc vào h thng mà chương trình ñược
dch.
Updatesofts.com Ebooks Team
Trang 68
Hàm calloc.
calloc
hot ñộng rt ging vi
malloc
, s khác nhau ch yếu là khai báo mu ca nó:
void * calloc (size_t nelements, size_t size);
nó s dng hai tham s thay vì mt. Hai tham s này ñược nhân vi nhau ñểñược kích
thước tng cng ca khi nh cn cp phát. Thông thường tham s ñầu tiên (
nelements
)
là s phn t và tham s thc hai (
size
) là kích thước ca mi phn t. Ví d, chúng ta
có th ñịnh nghĩa
bobby
vi
calloc
như sau:
int * bobby;
bobby = (int *) calloc (5, sizeof(int));
Mt ñim khác nhau na gia
malloc
calloc
calloc
khi to tt c các phn t
ca nó v 0.
Hàm realloc.
Nó thay ñổi kích thước ca khi nh ñã ñược cp phát cho mt con tr.
void * realloc (void * pointer, size_t size);
tham s
pointer
nhn vào mt con tr ñã ñược cp phát b nh hay mt con tr null, và
size
ch ñịnh kích thước ca khi nh mi. Hàm này s cp phát
size
byte b nh cho
con tr. Nó có th phi thay ñổi v v trí ca khi nh ñể có th ñủ ch cho kích thước
mi ca khi nh, trong trường hp này ni dung hin thi ca khi nh ñược copy ti v
trí mi ñể ñảm bo d liu không b mt. Con tr mi tr ti khi nh ñược hàm tr v.
Nếu không th thay ñổi kích thước ca khi nh thì hàm s tr v mt con tr null nhưng
tham s
pointer
và ni dung ca nó s không b thay ñổi.
Hàm free.
Hàm này gii phóng mt khi nh ñộng ñã ñược cp phát bi
malloc
,
calloc
hoc
realloc
.
void free (void * pointer);
Hàm này ch ñược dùng ñể gii phóng b nh ñược cp phát bi các hàm
malloc
,
calloc
and
realloc
.