Ngôn ngữ lập trình C++ Chương 4 – Mảng CuuDuongThanCong.com https://fb.com/tailieudientucntt Chương 4 – Mảng Đề mục 4.4 Ví dụ về sử dụng mảng 4.5 Truyền tham số cho hàm 4.6 Sắp xếp mảng 4.7 Ví dụ: Dùng mảng tính Mean, Median và Mode 4.8 Tìm kiếm trên mảng: Tìm kiếm Tuyến tính và tìm kiếm Nhị phân 4.9 Mảng nhiều chiều CuuDuongThanCong.com https://fb.1 Giới thiệu • Mảng (array) – Cấu trúc của những phần tử dữ liệu có liên quan – Thực thể tĩnh (giữ nguyên kích thước trong suốt chương trình) • Một vài loại mảng – mảng dựa vào con trỏ (Pointer-based arrays) (C-like) – mảng là đối tượng (Arrays as objects) (C++) CuuDuongThanCong.com https://fb.2 Mảng • Mảng – Tập hợp các vùng nhớ liên tiếp – Cùng tên, cùng kiểu (int, char, .) • Truy nhập đến 1 phần tử – Chỉ ra tên mảng và vị trí - position (chỉ số - index) – Cú pháp: tên_mảng[ chỉ_số ] – Phần tử đầu tiên ở vị trí 0 • Mảng c có n phần tử c[ 0 ], c[ 1 ] … c[ n - 1 ] – Phần tử thứ N ở vị trí thứ N-1 CuuDuongThanCong.com https://fb.2 Mảng • Phần tử của mảng cũng như các biến khác – Gán giá trị và in mảng số nguyên c c[ 0 ] = 3; cout << c[ 0 ]; • Có thể sử dụng các phép toán trong cặp ngoặc vuông c[ 5 – 2 ] cũng giống c[3] CuuDuongThanCong.com https://fb.com/tailieudientucntt Tên mảng (Lưu ý rằng mọi phần tử của mảng này đều có cùng tên, c) c[0] -45 c[1] 6 c[2] 0 c[3] 72 c[4] 1543 c[5] -89 c[6] 0 c[7] 62 c[8] -3 c[9] 1 c[10] 6453 c[11] 78 Chỉ số của phần tử trong mảng c CuuDuongThanCong.com https://fb.3 Khai báo mảng • Khi khai báo mảng, chỉ rõ – Tên – Kiểu của mảng • Bất cứ kiểu dữ liệu nào – Số phần tử – type arrayName[ arraySize ]; int c[ 10 ]; // mảng của 10 số nguyên float d[ 3284 ]; // mảng của 3284 số thực • Khai báo nhiều mảng cùng kiểu – Sử dụng dấu phẩy như với các biến bình thường int b[ 100 ], x[ 27 ]; CuuDuongThanCong.com https://fb.4 Ví dụ về sử dụng mảng • Khởi tạo mảng – Dùng vòng lặp khởi tạo từng phần tử – Khởi tạo cả danh sách • Chỉ rõ từng phần tử khi khai báo mảng int n[ 5 ] = { 1, 2, 3, 4, 5 }; • Nếu trong danh sách không có đủ số giá trị khởi tạo, các phần tử ở bên phải nhất sẽ nhận giá trị 0 • Nếu danh sách thừa sẽ gây lỗi cú pháp – Khởi tạo giá trị bằng 0 cho tất cả các phần tử int n[ 5 ] = { 0 }; – Nếu không khai báo kích thước mảng, kích thước của danh sách các giá trị khởi tạo sẽ quyết định kích thước mảng int n[] = { 1, 2, 3, 4, 5 }; • Có 5 giá trị khởi tạo, do đó mảng có 5 phần tử • Nếu không khai báo kích thước mảng thì phải khởi tạo khi khai báo CuuDuongThanCong.com https://fb.com/tailieudientucntt 1 // Fig.cpp 2 // Initializing an array. 3 #include <iostream> 4 fig04_03.cpp 5 using std::cout; (1 of 2) 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 Khai báo mảng 10 phần tử số nguyên. 12 int main() 13 { 14 int n[ 10 ]; Khởi tạo mảng bằng vòng lặp for. // n is an array of 10 integers 15 Chú ý rằng mảng gồm các phẩn tử 16 // initialize elements of array n to 0 từ n[0] đến n[9].
Hướng Dẫn Lập Trình Mảng Trong C++: Tài Liệu Giáo Trình & Bài Giảng Học Thuật
Tổng quan về giáo trình
Tài liệu "Chương 4 – Mảng" thuộc hệ thống bài giảng và giáo trình môn học Ngôn ngữ lập trình C++, được biên soạn phục vụ học phần cơ sở ngành trong chương trình đào tạo Cử nhân và Kỹ sư thuộc khối ngành Công nghệ Thông tin, Khoa học Máy tính và Kỹ thuật Phần mềm. Trong cấu trúc chương trình đào tạo đại học, học phần này đóng vai trò bản lề, liên kết kiến thức lập trình căn bản (kiểu dữ liệu nguyên thủy, cấu trúc rẽ nhánh, vòng lặp, hàm) với các học phần nâng cao như Cấu trúc dữ liệu và Giải thuật, Lập trình hướng đối tượng và Lập trình hệ thống.
Mục tiêu học tập của tài liệu tập trung vào việc trang bị cho người học:
- Bản chất cấu trúc lưu trữ của mảng (array) trong bộ nhớ máy tính.
- Cú pháp khai báo, định nghĩa, khởi tạo mảng tĩnh và mảng cục bộ tĩnh (
static). - Kỹ thuật sử dụng hằng số (
const) để kiểm soát kích thước và bảo vệ dữ liệu mảng. - Cơ chế truyền tham số mảng vào hàm theo tham chiếu (pass-by-reference) và truyền phần tử mảng theo giá trị (pass-by-value).
- Các thuật toán xử lý dữ liệu cơ bản trên mảng: duyệt mảng, tính tổng, thống kê phân phối tần số, vẽ biểu đồ Histogram, sắp xếp nổi bọt (Bubble Sort), tìm kiếm tuyến tính (Linear Search), tìm kiếm nhị phân (Binary Search), tính các đại lượng thống kê mô tả (Mean, Median, Mode), và xử lý mảng nhiều chiều.
Giáo trình tiếp cận theo phương pháp kết hợp lý thuyết cấu trúc bộ nhớ với mã nguồn mẫu có chú thích chi tiết theo từng dòng lệnh, đối sánh trực tiếp với kết quả thực thi (output) và phân tích các mã lỗi biên dịch thực tế của trình biên dịch C++.
Nội dung kiến thức cốt lõi
Các chương và chủ đề chính
Nội dung tài liệu được cấu trúc tuần tự qua các đề mục chuyên biệt từ cơ bản đến nâng cao:
- Mục 4.1 – Giới thiệu về Mảng: Định nghĩa mảng là một cấu trúc dữ liệu chứa tập hợp các phần tử có liên quan, là thực thể tĩnh với kích thước cố định trong suốt quá trình thực thi chương trình. Phân loại mảng gồm hai dạng chính: mảng dựa vào con trỏ (Pointer-based arrays - kế thừa từ ngôn ngữ C) và mảng là đối tượng (Arrays as objects trong C++).
- Mục 4.2 & 4.3 – Cấu trúc bộ nhớ và Khai báo mảng: Xác lập nguyên lý bố trí mảng trên các vùng nhớ liên tiếp nhau, cùng tên và cùng kiểu dữ liệu (
int,char,float...). Cú pháp truy nhập phần tử thông qua chỉ số:tên_mảng[chỉ_số], quy ước chỉ số bắt đầu từ0đếnn - 1đối với mảng cónphần tử. Cú pháp khai báo chuẩn:type arrayName[arraySize];(ví dụ:int c[10];,float d[3284];, khai báo đồng thời nhiều mảng:int b[100], x[27];). - Mục 4.4 – Kỹ thuật và Ví dụ sử dụng mảng:
- Khởi tạo bằng vòng lặp: Khởi tạo từng phần tử qua cấu trúc
for(fig04_03.cpp). - Danh sách khởi tạo (Initializer list): Khởi tạo trực tiếp bằng cú pháp
int n[5] = {1, 2, 3, 4, 5};(fig04_04.cpp). Quy tắc tự động gán giá trị0cho các phần tử còn thiếu (int n[5] = {0};) và quy tắc xác định kích thước tự động qua danh sách khởi tạo (int n[] = {1, 2, 3, 4, 5};). - Ứng dụng từ khóa
const: Sử dụng biến chỉ đọc (const int arraySize = 10;) để định nghĩa kích thước mảng (fig04_05.cpp). Phân tích cơ chế bắt lỗi cú pháp khi không khởi tạo hằng (error C2734) hoặc cố tình thay đổi giá trị của biếnconst(error C2166trongfig04_07.cpp). - Ứng dụng tính toán và thống kê: Tính tổng giá trị các phần tử trong mảng (
fig04_08.cpp); in biểu đồ phân bố Histogram bằng ký tự dấu sao*(fig04_09.cpp); ứng dụng mảng đếm tần suất thay thế 20 dòng lệnhswitch-casetrong mô phỏng tung xúc xắc 6000 lần với hàmrand()vàsrand(time(0))(fig04_10.cpp); chương trình phân tích 40 điểm số sinh viên (fig04_11.cpp). - Xử lý xâu ký tự (C-string): Bản chất xâu ký tự là mảng
charkết thúc bằng ký tự null'\0'. Phân tích hai cách khai báochar string1[] = "hello";vàchar string1[] = {'h', 'e', 'l', 'l', 'o', '\0'};. Kỹ thuật nhập xâu quacin, xuất quacout, cơ chế dừng khi gặp khoảng trắng và cảnh báo lỗi tràn bộ đệm (fig04_12.cpp). - Lớp lưu trữ tĩnh (
staticstorage): Khảo sát vòng đời và phạm vi của mảng tĩnh cục bộ (static int array1[3];) - được tự động khởi tạo về0và bảo toàn giá trị giữa các lần gọi hàm, so sánh với mảng tự động (automatic local array) bị hủy và khởi tạo lại mỗi khi gọi hàm (fig04_13.cpp).
- Khởi tạo bằng vòng lặp: Khởi tạo từng phần tử qua cấu trúc
- Mục 4.5 – Truyền mảng cho hàm: Cơ chế truyền mảng bằng tham chiếu (pass-by-reference) khi truyền tên mảng (đại diện cho địa chỉ phần tử đầu tiên), cho phép hàm chỉnh sửa dữ liệu gốc (
fig04_14.cpp). Cơ chế truyền từng phần tử riêng lẻ theo giá trị (pass-by-value). Sử dụng bộ hạn định kiểuconsttrong prototype hàm (void tryToModifyArray(const int []);) để ngăn chặn việc sửa đổi mảng gốc (fig04_15.cpp). - Mục 4.6 – Sắp xếp mảng (Bubble Sort): Giải thuật sắp xếp nổi bọt dựa trên việc duyệt nhiều lần qua các cặp phần tử liền kề và thực hiện hoán vị (swap) thông qua biến tạm
hold(fig04_16.cpp). - Mục 4.7 – Phân tích dữ liệu thống kê: Ứng dụng mảng trong việc tính toán Mean (trung bình cộng), Median (trung vị trên mảng đã sắp xếp), và Mode (yếu vị - giá trị có tần suất xuất hiện cao nhất) trên tập dữ liệu khảo sát gồm 99 phản hồi (
fig04_17.cpp). - Mục 4.8 & 4.9 – Tìm kiếm và Mảng nhiều chiều: Nguyên lý tìm kiếm tuyến tính (Linear Search), tìm kiếm nhị phân (Binary Search) và cấu trúc biểu diễn mảng 2 chiều, mảng nhiều chiều.
CẤU TRÚC KIẾN THỨC CHƯƠNG 4 - MẢNG TRONG C++
+-------------------------------------------------------------+
| 4.1 - 4.3: NỀN TẢNG BỘ NHỚ VÀ CÚ PHÁP |
| - Bộ nhớ liên tiếp | Chỉ số 0 đến n-1 |
| - Khai báo: type arrayName[arraySize] |
+-------------------------------------------------------------+
+-------------------------------------------------------------+
| 4.4: KỸ THUẬT KHỞI TẠO VÀ CÁC BIẾN THỂ |
| - Vòng lặp for | Initializer list |
| - Named constant (const int) | Static vs Automatic arrays |
| - Mảng ký tự (C-strings kết thúc '\0') |
+-------------------------------------------------------------+
+-------------------------------------------------------------+
| 4.5: GIAO TIẾP VỚI HÀM (FUNCTION INTERACTION) |
| - Truyền cả mảng: Pass-by-reference (Địa chỉ đầu) |
| - Truyền phần tử: Pass-by-value |
| - Bảo vệ dữ liệu với const type qualifier |
+-------------------------------------------------------------+
+-------------------------------------------------------------+
| 4.6 - 4.9: GIẢI THUẬT VÀ ỨNG DỤNG THỰC TIỄN |
| - Thuật toán: Bubble Sort | Linear Search | Binary Search |
| - Thống kê: Histogram | Random Simulation | Mean-Median-Mode|
| - Mở rộng: Mảng nhiều chiều (Multidimensional arrays) |
+-------------------------------------------------------------+
Kiến thức nền tảng được xây dựng
- Mô hình bộ nhớ tuyến tính: Người học hiểu rõ cách thức hệ điều hành và trình biên dịch cấp phát một khối bộ nhớ liền kề cho mảng, cách tính toán địa chỉ phần tử $c[i] = \text{address}(c[0]) + i \times \text{sizeof}(\text{type})$.
- Kỷ luật định kiểu và phạm vi biến: Nắm vững nguyên tắc bất biến của hằng số
const, sự khác biệt giữa thời gian tồn tại (lifetime) và phạm vi nhìn thấy (scope) của biếnstaticso với biến tự động trên Call Stack. - Cơ chế tham chiếu con trỏ ẩn: Hiểu rõ lý do khi truyền tên mảng vào hàm, bản chất là truyền con trỏ trỏ tới vùng nhớ gốc, từ đó nhận diện được tác dụng phụ (side-effects) và cách phòng tránh bằng từ khóa
const.
Kỹ năng phát triển
- Kỹ năng kỹ thuật: Khai báo, khởi tạo, thao tác duyệt và cập nhật mảng; sử dụng thư viện
<iomanip>(setw,setprecision,fixed) để định dạng dữ liệu bảng; sử dụng<cstdlib>và<ctime>để sinh số ngẫu nhiên. - Kỹ năng thuật toán: Cài đặt thuật toán hoán vị biến, thiết lập vòng lặp lồng nhau trong thuật toán sắp xếp nổi bọt, xử lý mảng tần số để đếm số lần xuất hiện của phần tử.
- Kỹ năng kiểm thử và gỡ lỗi: Nhận diện các lỗi biên dịch liên quan đến biến hằng (
error C2734: 'x' : const object must be initialized,error C2166: l-value specifies const object), kiểm soát biên mảng để tránh lỗi truy xuất ngoài vùng nhớ (out-of-bounds index).
Phương pháp giảng dạy và học tập
Phương pháp tiếp cận sư phạm
Giáo trình sử dụng phương pháp giảng dạy dựa trên mã nguồn trực quan (Live-code / Example-driven approach). Mỗi đơn vị lý thuyết đều đi kèm với một chương trình hoàn chỉnh có thể biên dịch và chạy trực tiếp, được đánh mã số hình học thuật chuẩn xác (từ fig04_03.cpp đến fig04_17.cpp).
| Mã chương trình | Tên chủ đề thực thi | Mục tiêu minh họa kỹ thuật |
|---|---|---|
fig04_03.cpp |
Initializing an array | Khởi tạo mảng bằng vòng lặp for và in bảng với setw |
fig04_04.cpp |
Initializing with a declaration | Sử dụng danh sách khởi tạo (initializer list) |
fig04_05.cpp |
Constant variable array size | Sử dụng const int arraySize để xác định kích thước |
fig04_06.cpp |
Initialized constant variable | Khai báo và gán trị hợp lệ cho hằng số |
fig04_07.cpp |
Uninitialized/modified const | Phân tích lỗi biên dịch C2734 và C2166 khi vi phạm quy tắc const |
fig04_08.cpp |
Summing elements of an array | Thuật toán cộng dồn giá trị tích lũy |
fig04_09.cpp |
Histogram printing program | Vòng lặp lồng nhau vẽ biểu đồ ký tự * |
fig04_10.cpp |
Roll a six-sided die 6000 times | Mảng tần số đếm số ngẫu nhiên thay thế switch-case |
fig04_11.cpp |
Student mark statistic program | Phân tích và đếm phân phối điểm của 40 sinh viên |
fig04_12.cpp |
Character arrays as strings | Nhập xuất xâu ký tự với cin, cout và ký tự '\0' |
fig04_13.cpp |
Static vs Automatic arrays | Đối chiếu vòng đời mảng static và mảng tự động qua nhiều lần gọi hàm |
fig04_14.cpp |
Passing arrays and elements | So sánh cơ chế truyền tham chiếu (mảng) và truyền giá trị (phần tử) |
fig04_15.cpp |
Const type qualifier | Khóa quyền chỉnh sửa mảng trong hàm bằng const int [] |
fig04_16.cpp |
Bubble sort | Cài đặt thuật toán sắp xếp nổi bọt với biến tạm hold |
fig04_17.cpp |
Survey data analysis | Modular hóa chương trình tính Mean, Median, Mode cho 99 mẫu khảo sát |
Bài tập và đồ án tình huống (Case studies)
Tài liệu đưa ra các bài toán mang tính ứng dụng thực tế cao:
- Mô phỏng xác suất xúc xắc: Khảo sát tính đồng đều của bộ sinh số ngẫu nhiên qua 6000 lần gieo, lưu kết quả vào mảng
frequency[7]với chỉ số tương ứng trực tiếp với mặt xúc xắc từ 1 đến 6. - Hệ thống phân tích điểm thi: Xử lý mảng
marks[40]chứa điểm của sinh viên và phân loại vào mảngfrequency[11](thang điểm từ 0 đến 10). - Phân tích dữ liệu khảo sát xã hội học: Tích hợp các hàm
mean(),median(),mode(),bubbleSort(),printArray()để xử lý mảngresponse[99].
Hướng dẫn tự học và đánh giá
Người học được yêu cầu theo dõi từng bước thay đổi giá trị trong các bảng theo dõi biến (trace table), tự tay viết lại các hàm độc lập, và thực hành biên dịch để quan sát thông báo lỗi của trình biên dịch khi thử phá vỡ các nguyên tắc bảo vệ bộ nhớ (ví dụ: gán lại giá trị cho tham số const).
Điểm nổi bật và cập nhật
- Chuyển giao phương pháp luận từ C sang C++: Tài liệu phân định rõ ranh giới giữa mảng kiểu C truyền thống (dựa trên con trỏ thuần túy) và cách tiếp cận mảng có cấu trúc trong C++, đồng thời giới thiệu khái niệm mảng đối tượng, đặt nền móng cho các cấu trúc trừu tượng hóa cao hơn.
- Chuẩn hóa kỹ thuật lập trình với Hằng số định danh (
named constant): Nhấn mạnh việc loại bỏ các "số ma thuật" (magic numbers) trong mã nguồn bằng cách sử dụngconst int arraySize, giúp chương trình có tính tái sử dụng cao, dễ bảo trì khi cần thay đổi quy mô dữ liệu. - Kỹ thuật bảo toàn tính toàn vẹn dữ liệu (Data Integrity): Phân tích sâu kỹ thuật sử dụng
constqualifier trong danh sách tham số của hàm. Điều này cho phép tối ưu hiệu năng (không tốn chi phí sao chép toàn bộ mảng khi truyền vào hàm) nhưng vẫn đảm bảo tính an toàn tương đương với cơ chế truyền theo giá trị. - Cảnh báo lỗi an toàn bộ nhớ trong xử lý xâu: Đưa ra lưu ý cụ thể về cơ chế đọc xâu của toán tử
cin >>(dừng tại khoảng trắng, tự động thêm ký tự null'\0'), đồng thời chỉ rõ rủi ro tràn bộ nhớ đệm (buffer overflow) khi độ dài xâu vượt quá kích thước mảng khai báo, dẫn chiếu sang mục 5.12 để cung cấp giải pháp xử lý triệt để.
Đối tượng sử dụng giáo trình
- Sinh viên đại học: Sinh viên học kỳ 1 hoặc học kỳ 2 thuộc các ngành Công nghệ Thông tin, Kỹ thuật Máy tính, Kỹ thuật Dữ liệu, Khoa học Máy tính, Hệ thống Thông tin, Điện tử Viễn thông đang học học phần Kỹ thuật lập trình hoặc Ngôn ngữ lập trình C++.
- Điều kiện tiên quyết (Prerequisites): Người học cần nắm vững cú pháp C++ cơ bản, các kiểu dữ liệu nguyên thủy (
int,char,float), cấu trúc rẽ nhánh điều kiện (if,switch-case), vòng lặp (for,while), và kỹ thuật xây dựng hàm căn bản (Chương 3). - Giảng viên: Dùng làm đề cương bài giảng lý thuyết, giáo án trình chiếu trên lớp và xây dựng hệ thống bài tập thực hành phòng máy (lab exercises), đề thi thực hành kết thúc học phần.
- Người tự học và kỹ sư chuyển đổi ngành: Tài liệu đóng vai trò là tài liệu tham khảo chuẩn xác về mặt cú pháp và cơ chế cấp phát bộ nhớ tĩnh của C++ trước khi học các chủ đề chuyên sâu về Con trỏ (Chương 5) và Cấu trúc dữ liệu.
Câu hỏi thường gặp
1. Giáo trình này phù hợp với đối tượng người học nào?
Tài liệu phù hợp cho sinh viên bậc đại học và cao đẳng kỹ thuật đang theo học các môn lập trình cơ sở, cũng như những người muốn nắm vững nguyên lý quản lý bộ nhớ và cấu trúc mảng trong C++.
2. Cần chuẩn bị kiến thức nền tảng nào trước khi học chương này?
Người học cần hoàn thành các nội dung về kiểu dữ liệu cơ sở, biến, toán tử, các cấu trúc điều khiển luồng chương trình (if-else, vòng lặp for) và cách khai báo hàm căn bản đã được trình bày ở các chương trước.
3. Sự khác biệt căn bản giữa việc truyền toàn bộ mảng và truyền một phần tử mảng vào hàm là gì?
Theo Mục 4.5 của tài liệu:
- Khi truyền toàn bộ mảng, tên mảng được truyền đi thực chất là địa chỉ của phần tử đầu tiên (cơ chế truyền theo tham chiếu - pass-by-reference). Hàm nhận có khả năng truy cập và sửa đổi trực tiếp dữ liệu của mảng gốc trong bộ nhớ.
- Khi truyền một phần tử đơn lẻ của mảng (ví dụ:
modifyElement(a[3])), giá trị của phần tử được sao chép vào tham số cục bộ của hàm (cơ chế truyền theo giá trị - pass-by-value), do đó giá trị gốc trong mảng không bị thay đổi sau khi hàm kết thúc.
4. Làm cách nào để ngăn chặn một hàm làm thay đổi dữ liệu của mảng được truyền vào?
Người lập trình sử dụng bộ định kiểu const trước kiểu dữ liệu mảng trong danh sách tham số của prototype và định nghĩa hàm (ví dụ: void tryToModifyArray(const int b[])). Khi đó, mọi thao tác cố tình gán hoặc sửa đổi giá trị phần tử mảng trong thân hàm đều bị trình biên dịch chặn và báo lỗi cú pháp.
5. Xâu ký tự (string) được lưu trữ và xử lý như thế nào trong chương này?
Trong C++, xâu ký tự kiểu C được xem là một mảng các ký tự (char) và bắt buộc phải kết thúc bằng ký tự null ('\0'). Khi khai báo char string1[] = "hello";, mảng thực tế sẽ chiếm 6 byte bộ nhớ. Các thao tác xuất qua cout sẽ duyệt và in từng ký tự cho đến khi gặp ký tự '\0'.
Kết luận
Chương 4 – Mảng cung cấp một nền tảng kiến thức toàn diện và có hệ thống về cấu trúc dữ liệu tuyến tính tĩnh trong ngôn ngữ C++. Thông qua việc kết hợp chặt chẽ giữa lý thuyết phân bổ bộ nhớ, phân tích mã nguồn chuẩn mực và các ứng dụng giải thuật thực tế (thống kê, sắp xếp, tìm kiếm), tài liệu giúp người học hình thành tư duy lập trình cấu trúc và kỹ năng tối ưu hóa mã lệnh.
Lộ trình học tập tiếp nối hợp lý sau khi hoàn thành chương này là chuyển tiếp sang nghiên cứu Chương 5 – Con trỏ và Chuỗi ký tự nâng cao (Pointers and Advanced Strings), nơi các cơ chế bộ nhớ gián tiếp, cấp phát động và mối liên hệ giữa mảng và con trỏ sẽ được khảo sát chuyên sâu.