CHƯƠNG 3: Mảng và con trỏ... Mảng Mảng Array Là một tập các vị trí nhớ liên tiếp nhau Các phần tử trong mảng có cùng tên và cùng kiểu.. Truy nhập tới phần tử trong mảng Xác định
Trang 1CHƯƠNG 3: Mảng và con trỏ
Trang 21 Mảng
Mảng (Array)
Là một tập các vị trí nhớ liên tiếp nhau
Các phần tử trong mảng có cùng tên và cùng kiểu.
Truy nhập tới phần tử trong mảng
Xác định thông qua tên mảng và chỉ số:
Phần tử đầu tiên ở vị trí thứ 0
Trang 3Khai báo mảng
int c[ 10 ]; // mảng c gồm 10 số nguyên float d[ 3284 ]; // mảng d gồm 3284 số thực
Có thể khai báo nhiều mảng cùng kiểu
int b[ 100 ], x[ 27 ];
Trang 5 Mảng được truyền theo kiểu truyền tham chiếu
Hàm có thể chỉnh sửa dữ liệu của các phần tử trong mảng
Tên mảng là địa chỉ của phần tử đầu tiên
Trang 8 char string1[] = "hello";
Ký tự null được tự động bổ sung.
string1 có 6 ký tự
char string1[] = {'h', 'e', 'l', 'l','o', '\0’ };
Trang 9Kiểu dữ liệu string
string là một lớp chuẩn trong C++
Các ký tự trong string được đánh từ 0
Khởi tạo một biến kiểu string như sau:
Trang 110x1054 0x1055 0x1056 0x1057
int i; Địa chỉ của i
char c; Địa chỉ của c
short s; Địa chỉ của s
Trang 12 Ví dụ:
int i=17;
int* ptr; // khai báo biến trỏ kiểu int
ptr= &i; // gán địa chỉ của biến i cho con trỏ ptr
cout << *ptr << endl; // hiển thị nội dung của biến i
Trang 13Biến con trỏ …
17 0x1054
Trang 14Biến con trỏ …
int v; // khai báo biến v kiểu int
int w; // khai báo biến w kiểu int
int* p; // khai báo biến p kiểu con trỏ trỏ tới kiểu int p=&v;
// gán địa chỉ của v cho con trỏ p
Trang 15Con trỏ hằng
Khai báo hằng:
const int result = 5; // result là hằng result = 10; // sau đó gán lại giá trị thì C++ sẽ báo lỗi
Khai báo con trỏ hằng:
const char* answer_ptr = "Forty-Two";
// answer_ptr là con trỏ trỏ tới hằng kiểu char
Dữ liệu được trỏ bởi con trỏ hằng thì không thể thay đổi nhưng con trỏ thì có thể.
answer_ptr = "Fifty-One"; // đúng (answer_ptr là biến con trỏ)
*answer_ptr = 'X'; // sai (*answer_ptr là hằng)
Trang 16Con trỏ hằng …
Nếu khai báo:
char *const nameptr = "Test"; //name_ptr là con trỏ hằng nameptr = "New"; // sai (name_ptr là hằng)
*nameptr = 'B'; // đúng (*nameptr là char)
Nếu khai báo như sau thì không thể thay đổi được cả con trỏ và nội dung của con trỏ:
const char* const titleptr = "Title";
Trang 17int array[5] = { 23, 5, 12, 34, 17 };
// sử dụng chỉ số để truy nhập tới các phần tử của mảng
for (int i=0; i< 5; i++)
cout << array[i] << endl;
// sử dụng con trỏ để truy nhập tới các phần tử của mảng
for (int i=0; i< 5; i++)
cout << *(array+i) << endl;
Trang 19Con trỏ là tham số của hàm
C++ cung cấp 3 cách truyền tham số:
Truyền tham trị: void f(int x);
Truyền tham chiếu: void f(int& x);
Truyền con trỏ: void f(int* x);
Trang 20Con trỏ là tham số của hàm …
void swap( double& x, double& y)
swap(a,b); // gọi tham chiếu của biến a và b
swap(&a, &b); // sử dụng địa chỉ của biến a và b
Trang 21Con trỏ là tham số của hàm…
void bsort (double* ptr, int n)
Trang 22Phép toán học trên con trỏ
Phân biệt các phép toán trên biến con trỏ và biến thông thường.
Trang 24{ int* pint; pint=(int*)data; ++(*pint); }}
Trang 25Con trỏ null
Con trỏ có giá trị null tức là không trỏ vào một địa chỉ nhớ cụ thể nào.
Trang 28Bộ nhớ động
Cấp phát bộ nhớ trong khi thực thi
chương trình
Toán tử new: cấp phát bộ nhớ
pointer = new type
pointer = new type [number_of_elements]
Toán tử delete: xóa vùng nhớ đã cấp
delete pointer;
delete [] pointer;
Trang 29int i,n; int * p;
cout << "How many numbers would you like to type? "; cin >> i;p= new int[i];
if (p == 0)
cout << "Error: memory could not be allocated";
else{
for (n=0; n<i; n++){
cout << "Enter number: ";
cin >> p[n];
}cout << "You have entered: ";
for (n=0; n<i; n++)
cout << p[n] << ", ";
delete[] p;
}return 0;