Saturday, August 8, 2015

Mảng trong C/C++

1. Định nghĩa mảng
Mảng là một khối các ô nhớ liên tục nhau, được chia thành nhiều cell(phần tử), mỗi cell chứa một đối tượng. Các cell sẽ được truy cập bằng chỉ một số index riêng. Cell dầu tiên có chỉ số index là 0, và tăng dần tiếp theo.
Mảng là một kiểu random-access structor bởi vì có thể truy cập bất cứ phần từ nào của mảng ngay lập tức bằng index của nó, cho dù phần tử ở vị trí nào trong mảng thì thời gian truy cập vẫn như nhau.
Có 2 kiểu mảng: mảng tỉnh(static array) và mảng động(dynamic array).
- Mảng tỉnh là mảng có kích thước không đổi.
- Mảng động là mảng có kích thước có thể thay đổi được.
2. Truy cập mảng
Truy cập mảng có thể dùng một trong các cách sau:

int* array = new int[5];   //Khoi tao mang voi do dai la 5
array[2] = 5;              //Gan gia tri 5 vo cell co index 2
array[3] = array[2];       //Lay gia tri cell co index 2 
                           //gan vao cel co index 3
Mảng thường được sử dụng như một con trỏ trỏ vào phần tử đầu tiên(index 0) của mảng. Có thể dùng với các toán tử +, -, ++, -- để trỏ đến một vị trí khác trogn mảng.

int* array = new int[5];   //Khoi tao mang, 
                           //mac dinh con tro array chi vao index 0
array++;                   //Di chuyen con tro 
                           //sang phai 1 phan tu(index 1)
array--;                   //Di chuyen con tro 
                           //sang trai 1 phan tu( ve lai index 0)
array = array + 3;         //Di chuyen con tro 
                           //sang phai 3 phan tu(index 3)
3. Khởi tạo mảng
+ Mảng tỉnh, khoirwtaoj bằng dấu ngoặc vuông []

int arr1[10];              //Tao mang tinh co 10 phan tu.
int arr2[10] = {1, 5, 9};  //Tao mang tinh co 10 phan tu, 
                           //va gan gia tri cho 3 phan tu dau.
+ Mảng động khởi tạo bằng new hoặc malloc

int* arr1 = new int[10];              //Tao mang dong co 10 phan tu.
int* arr2 = new int[10]{1, 5, 4};     //Tao mang dong co 10 phan tu, 
                                      //va gan gia tri cho 3 phan tu dau.
int* arr3 = (int*)malloc(sizeof(int)*10); //Tao mang co 10 phan tu.
Khi khởi tạo vùng nhớ chứa mảng tỉnh nằm trên stack, vùng nhớ chứa mảng động nằm trên heap. Xem new, malloc và calloc
Mảng tỉnh sau khi sử dụng sẽ tự được hủy, mảng động không tự hủy được, phải gọi hàm hủy(nếu khởi tạo bằng new thì dùng delete[], nếu khởi tạo bằng malloc thì dùng free) cho nó.
4. Truyền mảng vào hàm

void func1(int arr[])
{
}

void func2(int* arr)
{
}

func1(array);
func2(array);
2 hàm này không khác gì nhau, chỉ khác về cách khai báo, một hàm dùng dấu [], một hàm dùng dấu * như con trỏ.
Lưu ý: Kích thước(tính theo byte) của mảng tỉnh được tình bằng hàm sizeof, nhưng đối với mảng động thì không tính được, phải lưu lại kích thước của nó khi sử dụng. Mảng tỉnh khi được truyền vào hàm thì trong hàm cũng k0 lấy được kích thước, nên cũng phải truyền theo kích thước vào hàm.

No comments:

Post a Comment