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}; . 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ể. = 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