29
© 2004, HOÀNG MINH SƠN
Chương 2: Các yếutố cơ bảncủaC vàC++
2.3.2 Kiểuhằng (const)
Cho phép khai báo như biếnsố, nhưng ₫ượcgángiá
trị cố₫ịnh bằng mộthằng số và không thể₫ượcthay
₫ổi => khai báo hằng số
void main() {
const double pi = 3.1412; // initializing is OK!
const int ci = 1; // initializing is OK!
ci = 2; // error!
ci = 1; // error, too!
int i = ci; // const int is a subset of int
const Color cc = Red;
cc = Green; // error
const double d; // potential error
}
30
© 2004, HOÀNG MINH SƠN
Chương 2: Các yếutố cơ bảncủaC vàC++
2.3.3 Kiểucon trỏ
Con trỏ thựcchấtlàmộtbiếnchứa ₫ịachỉ củamột
₫ốitượng có thể là mộtbiếnhoặcmộthàm.
int v = 2;
int* p = &v; // p holds the address of v
Con trỏ p
Vùng nhớ chứa biến CT
0x000127c3
&v
p:
chứa ₫ịa chỉ của biến v
v:
2
31
© 2004, HOÀNG MINH SƠN
Chương 2: Các yếutố cơ bảncủaC vàC++
2.3.3 Kiểucon trỏ
int i = 1;
int* p = &i;// p holds the address of i
*p = 2; // i = 2
int j;
p = &j; // now p holds the address of j
*p = 3; // j = 3, i remains 2
32
© 2004, HOÀNG MINH SƠN
Chương 2: Các yếutố cơ bảncủaC vàC++
Ví dụ sử dụng kiểucon trỏ
void main() {
int i = 0;
int* p = &i; // p refers to the addesss of i
int j = *p; // j = 0
*p = 2; // now i = 2
p = &j; // now p contains the addess of j
*p = 3; // now j = 3, i remains 2
double d = i; // OK, int is compatible to double
p = &d; // error, int* isn’t compatible to double*
p = (*int)&d; // no compile error, but dangerous,
// meaningles type conversion!
double* pd=0; // p contains the address 0
*pd = 0; // no compile error, but fatal error
pd = &d; // OK
double* pd2; // p refers to an uncertain address
*pd2 = 0; // fatal error
pd2 = &d; // OK, pd and pd2 refer to the same addr.
}
33
© 2004, HOÀNG MINH SƠN
Chương 2: Các yếutố cơ bảncủaC vàC++
Tóm tắtsơ bộ về con trỏ
Con trỏ là mộtbiếnchứa ₫ịachỉ byte ₫ầucủamộtbiếndữ liệu,
₫ượcsử dụng ₫ể truy cậpgiántiếpdữ liệu ₫ó
Sau khi khai báo mà không khởitạo, mặc ₫ịnh con trỏ mang
một ₫ịachỉ bất ₫ịnh
Địachỉ con trỏ mang có thể thay ₫ổi ₫ược => con trỏ có thể mỗi
lúc ₫ạidiệnchomộtbiếndữ liệu khác
Toán t
ử lấy ₫ịachỉ củamộtbiến(&) trả về con trỏ vào kiểucủa
biến=> thường gán cho biếncon trỏ
Toán tử truy nhậpnộidung (*) ápdụng cho con trỏ trả về biến
mà con trỏ mang ₫ịachỉ => có thể₫ọchoặcthay₫ổi giá trị của
biến ₫ó
Không bao giờ sử dụng toán tử truy nhậpnội dung, nếucon trỏ
chưamangmột ₫ịachỉ ô nhớ mà chươ
ng trình có quyềnkiểm
soát
34
© 2004, HOÀNG MINH SƠN
Chương 2: Các yếutố cơ bảncủaC vàC++
2.3.4 Kiểumảng
012 N-1
Chỉ số
₫ịachỉ cuối
₫ịachỉ₫ầu
₫ịachỉ₫ầu-₫ịachỉ cuối = N * kích cỡ mộtphầntử
Cấutrúcdữ liệuvới:
—Số lượng các phầntử cố₫ịnh
—Cácphầntử có cùng kiểu
—Cácphầntử₫ượcsắpxếpkế tiếptrongbộ nhớ
—Cóthể truy nhậptừng phầntử mộtcáchtự do theo chỉ số hoặc
theo ₫ịachỉ
35
© 2004, HOÀNG MINH SƠN
Chương 2: Các yếutố cơ bảncủaC vàC++
Khai báo mảng
Số phầntử củamảng phảilàhằng số
nguyên (trong C phảilàmộttrựckiện,
trong C++ có thể là kiểu const )
Khai báo không khởitạo:
int a[3];
enum {index = 5};
double b[index];
const int N = 2;
char c[N]; // C++ only
Khai báo vớisố phầntử và khởitạo
giá trị các phầntử
int d[3]= {1, 2, 3};
double e[5]= {1, 2, 3};
char f[4]= {0};