Mảng trong C++ | Khai báo | Khởi tạo | Ví dụ về con trỏ tới mảng
Mảng là gì?
Mảng là một cấu trúc dữ liệu lưu trữ tuần tự các phần tử có cùng kiểu dữ liệu. MỘT C++ mảng có kích thước cố định.
Bạn có thể xem mảng là tập hợp các biến có kiểu dữ liệu tương tự. Thay vì khai báo từng biến và gán cho nó một giá trị riêng lẻ, bạn có thể khai báo một biến (mảng) và cộng giá trị của các biến khác nhau vào biến đó. Mỗi giá trị gia tăng vào mảng được xác định bằng một chỉ mục.
Tại sao chúng ta cần mảng?
Mảng rất quan trọng trong bất kỳ ngôn ngữ lập trình nào. Chúng cung cấp một cách thuận tiện hơn để lưu trữ các biến hoặc tập hợp dữ liệu có kiểu dữ liệu tương tự cùng nhau thay vì lưu trữ chúng riêng biệt. Mỗi giá trị của mảng sẽ được truy cập riêng biệt.
Khai báo một mảng trong C++
Khai báo mảng trong C++ liên quan đến việc nêu rõ loại cũng như số phần tử được lưu trữ trong mảng. Cú pháp:
type array-Name [ array-Size ];
Quy tắc khai báo mảng một chiều trong C++.
- Kiểu: Kiểu là loại phần tử được lưu trữ trong mảng và nó phải hợp lệ C++ loại dữ liệu.
- Tên mảng: Tên mảng là tên được gán cho mảng.
- Kích thước mảng: Kích thước mảng là số phần tử được lưu trữ trong mảng. Nó phải là số nguyên và lớn hơn 0.
Ví dụ, bạn có thể tạo một mảng tên là age và lưu trữ tuổi của 5 học sinh như sau:
int age[5];
Mảng age sẽ lưu trữ 5 số nguyên đại diện cho độ tuổi của các học sinh khác nhau.
Khởi tạo mảng
Khởi tạo mảng là quá trình gán/lưu trữ các phần tử vào một mảng. Việc khởi tạo có thể được thực hiện trong một câu lệnh hoặc từng câu lệnh một. Lưu ý rằng phần tử đầu tiên trong mảng được lưu ở chỉ mục 0, trong khi phần tử cuối cùng được lưu ở chỉ mục n-1, trong đó n là tổng số phần tử trong mảng.
Trong trường hợp mảng tuổi, phần tử đầu tiên sẽ được lưu ở chỉ mục 0, trong khi phần tử cuối cùng sẽ được lưu ở chỉ mục 4.
Chúng ta hãy sử dụng mảng age để chứng minh cách khởi tạo mảng có thể được thực hiện:
int age[5] = {19, 18, 21, 20, 17};
Tổng số phần tử trong { } không thể vượt quá giá trị được nêu trong [ ]. Phần tử 19 ở chỉ số 0, 18 ở chỉ số 1, 21 ở chỉ số 2, 20 ở chỉ số 3 và 17 ở chỉ mục 4. Nếu bạn không nêu rõ số phần tử sẽ được lưu trữ trong mảng trong [ ], thì mảng sẽ chỉ đủ lớn để chứa các phần tử được thêm vào trong { }. Ví dụ:
int age[] = {19, 18, 21, 20, 17};
Câu lệnh trên sẽ tạo ra mảng giống hệt như mảng trước đó. Bạn cũng có thể gán một phần tử cho một mảng bằng chỉ mục của nó. Ví dụ:
age[3] = 20;
Câu lệnh trên sẽ lưu trữ giá trị 20 tại chỉ mục 3 của mảng có tên age. Điều này có nghĩa là 20 sẽ là 4th phần tử của mảng.
Các loại mảng
Có hai loại C++ mảng:
- Mảng một chiều
- Mảng đa chiều
- Con trỏ tới một mảng
Mảng một chiều
Đây là một mảng trong đó các mục dữ liệu được sắp xếp tuyến tính chỉ theo một chiều. Nó thường được gọi là mảng 1-D. Cú pháp:
datatype array-name[size];
- Tên mảng là tên của mảng.
- Kích thước là số phần tử được lưu trữ trong mảng.
Ví dụ:
#include <iostream> using namespace std; int main() { int age[5] = { 19, 18, 21, 20, 17 }; for (int x = 0; x < 5; x++) { cout <<age[x]<<"\n"; } }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- Bao gồm tệp tiêu đề iostream trong mã của chúng tôi. Nó sẽ cho phép chúng ta đọc và ghi vào bảng điều khiển.
- Bao gồm không gian tên std để sử dụng các lớp và hàm của nó mà không cần gọi nó.
- Gọi hàm main() để thêm logic của chương trình vào bên trong.
- Bắt đầu phần thân của hàm main().
- Khai báo một mảng có tên age để lưu trữ 5 số nguyên. 5 số nguyên cũng đã được khởi tạo.
- Tạo một biến số nguyên x bằng vòng lặp for.
- Sự bắt đầu của phần thân vòng lặp for.
- Sử dụng biến vòng lặp x để lặp lại các giá trị của tuổi mảng và in chúng trên bảng điều khiển. “\n” là ký tự dòng mới và in thành dòng mới sau mỗi lần lặp.
- Phần cuối của cơ thể vòng lặp for.
- Phần cuối của hàm main().
Mảng đa chiều
Đây là một mảng trong đó các mục dữ liệu được sắp xếp để tạo thành một mảng các mảng. Mảng nhiều chiều có thể có số chiều bất kỳ, nhưng phổ biến nhất là mảng hai chiều và mảng ba chiều. Cú pháp:
datatype array-name[d1][d2][d3]...[dn];
Tên mảng là tên của mảng sẽ có n chiều. Ví dụ:
Mảng hai chiều
Mảng 2 chiều lưu trữ dữ liệu trong danh sách với mảng 1 chiều. Đây là ma trận có hàng và cột. Để khai báo mảng 2 chiều, hãy sử dụng cú pháp sau:
type array-Name [ x ][ y ];
Loại phải hợp lệ C++ kiểu dữ liệu. Xem mảng 2D dưới dạng bảng, trong đó x biểu thị số hàng trong khi y biểu thị số cột. Điều này có nghĩa là bạn xác định từng phần tử trong mảng 2D bằng cách sử dụng dạng a[x][y], trong đó x là số hàng và y là số cột chứa phần tử đó.
Đây là một ví dụ về cách khởi tạo mảng 2D:
int a[2][3] = { {0, 2, 1} , /* row at index 0 */ {4, 3, 7} , /* row at index 1 */ };
Trong ví dụ trên, chúng ta có một mảng 2D có thể được xem dưới dạng ma trận 2×3. Có 2 hàng và 3 cột. Phần tử 0 có thể được truy cập dưới dạng a[0][1] vì nó nằm ở giao điểm của hàng được lập chỉ mục 0 và cột được lập chỉ mục 1. Phần tử 3 có thể được truy cập dưới dạng a[1][2] vì nó nằm ở giao điểm của hàng được lập chỉ mục 1 và cột được lập chỉ mục 2.
Lưu ý rằng chúng tôi chỉ cần thêm dấu ngoặc nhọn để phân biệt các hàng phần tử khác nhau. Việc khởi tạo cũng có thể được thực hiện như sau:
int a[2][3] = {0, 2, 1, 4, 3, 7}; };
Sau đây C++ Ví dụ minh họa cách khởi tạo và duyệt một mảng 2 chiều:
#include <iostream> using namespace std; int main() { // a 2x3 array int a[3][2] = { {0, 2}, {1, 4}, {3, 7} }; // traverse array elements for (int i=0; i<3; i++) for (int j=0; j<2; j++) { cout << "a[" <<i<< "][" <<j<< "]: "; cout << a[i][j] << endl; } return 0; }
Đầu ra:
Đây là ảnh chụp màn hình của đoạn mã trên:
Giải thích mã:
- Bao gồm tệp tiêu đề iostream trong mã của chúng tôi. Nó sẽ cho phép chúng ta đọc và ghi vào bảng điều khiển.
- Bao gồm không gian tên std để sử dụng các lớp và hàm của nó mà không cần gọi nó.
- Gọi hàm main() trong đó mã sẽ được thêm vào.
- Bắt đầu phần thân của hàm main().
- Một bình luận. các C++ trình biên dịch sẽ bỏ qua điều này.
- Khai báo mảng 2D gồm 3 hàng và 2 cột. Các mục cũng đã được thêm vào mảng.
- Một bình luận. các C++ trình biên dịch sẽ bỏ qua điều này.
- Tạo một biến tôi sử dụng vòng lặp for. Biến này sẽ lặp qua các chỉ mục hàng của mảng.
- Tạo biến j bằng vòng lặp for. Biến này sẽ lặp qua các chỉ mục cột của mảng.
- Bắt đầu phần thân của vòng lặp.
- In giá trị của biến i và j ra màn hình điều khiển bên trong dấu ngoặc vuông trên màn hình điều khiển.
- In ra giá trị được lưu tại chỉ mục [i][j] của mảng a.
- Kết thúc phần thân của vòng lặp.
- Hàm main() sẽ trả về một giá trị nguyên nếu chương trình chạy tốt.
- Phần cuối của hàm main().
Mảng ba chiều
Mảng 3D là một mảng gồm nhiều mảng. Mỗi phần tử trong mảng 3D được xác định bởi một bộ 3 chỉ mục. Để truy cập các phần tử của mảng 3D, chúng ta sử dụng ba vòng lặp for. Ví dụ:
#include<iostream> using namespace std; void main() { int a[2][3][2] = {{{4, 8},{2, 4},{1, 6}}, {{3, 6},{5, 4},{9, 3}}}; cout << "a[0][1][0] = " << a[0][1][0] << "\n"; cout << "a[0][1][1] = " << a[0][1][1] << "\n"; }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- Bao gồm tệp tiêu đề iostream trong mã của chúng tôi. Nó sẽ cho phép chúng ta đọc và ghi vào bảng điều khiển.
- Bao gồm không gian tên std để sử dụng các lớp và hàm của nó mà không cần gọi nó.
- Gọi hàm main() để thêm logic của chương trình vào bên trong.
- Bắt đầu phần thân của hàm main().
- Khai báo một mảng 3D có tên là kích thước 2x3x2. Các giá trị của mảng cũng đã được khởi tạo.
- Truy cập mục được lưu trữ tại chỉ mục [0] [1] [0] của mảng và in nó trên bảng điều khiển.
- Truy cập mục được lưu trữ tại chỉ mục [0] [1] [1] của mảng và in nó trên bảng điều khiển.
- Phần cuối của hàm main().
Con trỏ tới một mảng
A con trỏ là một biến chứa địa chỉ. Ngoài việc sử dụng con trỏ để lưu trữ địa chỉ của một biến, chúng ta có thể sử dụng nó để lưu trữ địa chỉ của một ô mảng. Tên của mảng liên tục trỏ đến phần tử đầu tiên của nó. Hãy xem xét tuyên bố được đưa ra dưới đây:
int age[5];
Age là một con trỏ tới $age[0], địa chỉ của phần tử đầu tiên của một mảng có tên age. Hãy xem xét ví dụ sau:
#include <iostream> using namespace std; int main() { int *john; int age[5] = { 19, 18, 21, 20, 17 }; john = age; cout << john << "\n"; cout << *john; }
Đầu ra:
Lưu ý rằng giá trị đầu tiên của kết quả đầu ra ở trên có thể trả về một giá trị khác tùy thuộc vào địa chỉ được gán cho phần tử đầu tiên của mảng trong bộ nhớ máy tính của bạn.
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- Bao gồm tệp tiêu đề iostream trong mã của chúng tôi. Nó sẽ cho phép chúng ta đọc và ghi vào bảng điều khiển.
- Bao gồm không gian tên std để sử dụng các lớp và hàm của nó mà không cần gọi nó.
- Gọi hàm main() để thêm logic của chương trình vào bên trong.
- Bắt đầu phần thân của hàm main().
- Khai báo một biến con trỏ có tên *john.
- Khai báo một mảng số nguyên có tên age để lưu trữ 5 số nguyên. Các giá trị của số nguyên cũng đã được khởi tạo.
- Gán biến john giá trị địa chỉ của mục được lưu trữ trong chỉ mục đầu tiên của mảng tuổi.
- In giá trị của biến john, là địa chỉ của mục được lưu trong chỉ mục đầu tiên của mảng age.
- In giá trị đầu tiên được lưu trong mảng age.
- Phần cuối của hàm main().
Tên mảng có thể được sử dụng làm con trỏ không đổi và ngược lại cũng đúng. Điều này có nghĩa là bạn có thể truy cập giá trị được lưu trữ ở chỉ mục 3 của tuổi mảng bằng *(age + 3). Ví dụ:
#include <iostream> using namespace std; int main() { // an array of 5 elements. int age[5] = { 19, 18, 21, 20, 17 }; int *p; p = age; // output array values cout << "Using pointer: " << endl; for (int x=0; x<5; x++) { cout << "*(p + " << x << ") : "; cout << *(p + x) << endl; } cout << "Using age as address: " << endl; for (int x = 0; x < 5; x++) { cout << "*(age + " << x << ") : "; cout << *(age + x) << endl; } return 0; }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- Bao gồm tệp tiêu đề iostream trong mã của chúng tôi. Nó sẽ cho phép chúng ta đọc và ghi vào bảng điều khiển.
- Bao gồm không gian tên std để sử dụng các lớp và hàm của nó mà không cần gọi nó.
- Gọi hàm main() và bắt đầu phần thân của hàm main().
- Một bình luận. các C++ trình biên dịch sẽ bỏ qua điều này.
- Khai báo một mảng có tên age để lưu trữ 5 số nguyên.
- Tạo một con trỏ số nguyên p.
- Gán p giá trị địa chỉ của phần tử đầu tiên của tuổi mảng.
- Một bình luận. các C++ trình biên dịch sẽ bỏ qua điều này.
- In ra một số văn bản trên bảng điều khiển.
- Tạo một số nguyên x bằng cách sử dụng vòng lặp for. { đánh dấu sự bắt đầu phần thân của vòng lặp for.
- In ra các giá trị của x kết hợp với một số văn bản khác trên bảng điều khiển.
- In ra các giá trị của *(p + x) trên bảng điều khiển.
- Kết thúc phần thân của vòng lặp for.
- In ra một số văn bản trên bảng điều khiển.
- Tạo một biến x bằng cách sử dụng vòng lặp for. { đánh dấu sự bắt đầu của phần thân vòng lặp for.
- In ra các giá trị của x từ 0 đến 4 cùng với một số văn bản khác.
- In ra các giá trị của *(age + x).
- Kết thúc phần thân của vòng lặp for.
- Trả về giá trị nếu chương trình chạy thành công.
- Phần cuối của hàm main().
Truy cập các giá trị của một mảng
Các phần tử của một mảng được truy cập bằng cách sử dụng các chỉ số tương ứng của chúng. Chỉ số của phần tử được truy cập được thêm vào trong dấu ngoặc vuông [ ] ngay sau tên mảng. Ví dụ:
int john = age[2];
Trong ví dụ trên, chúng ta chỉ đơn giản nói rằng tuổi của John được lưu trữ ở chỉ mục 2 của mảng có tên age. Điều này có nghĩa là tuổi của John là 3rd giá trị trong tuổi mảng. Đây là một bản hoàn chỉnh C++ ví dụ cho thấy cách truy cập và in ra giá trị này:
#include<iostream> using namespace std; int main() { int age[5] = { 19, 18, 21, 20, 17 }; int john = age[2]; cout << "The age of John is:"<<john; }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- Bao gồm tệp tiêu đề iostream trong mã của chúng tôi. Nó sẽ cho phép chúng ta đọc và ghi vào bảng điều khiển.
- Bao gồm không gian tên std để sử dụng các lớp và hàm của nó mà không cần gọi nó.
- Gọi hàm main() trong đó mã sẽ được thêm vào.
- Bắt đầu phần thân của hàm main().
- Khai báo một mảng có tên age để lưu trữ 5 phần tử số nguyên.
- Truy cập giá trị được lưu trữ tại chỉ mục 2 của tuổi mảng và lưu trữ giá trị của nó trong một biến có tên john.
- In giá trị của biến john trên bảng điều khiển cùng với văn bản khác.
Ưu điểm của mảng trong C++
Sau đây là những ưu/lợi ích của việc sử dụng Array trong C++:
- Các phần tử mảng có thể được duyệt qua dễ dàng.
- Dễ dàng thao tác dữ liệu mảng.
- Các phần tử mảng có thể được truy cập ngẫu nhiên.
- Mảng tạo điều kiện tối ưu hóa mã; do đó, chúng ta có thể thực hiện nhiều công việc với ít mã hơn.
- Dễ dàng sắp xếp dữ liệu mảng.
Nhược điểm của mảng trong C++
- Một mảng có kích thước cố định; do đó, chúng tôi không thể thêm các phần tử mới vào nó sau khi khởi tạo.
- Việc phân bổ nhiều bộ nhớ hơn yêu cầu sẽ dẫn đến lãng phí dung lượng bộ nhớ và việc phân bổ ít bộ nhớ hơn có thể gây ra sự cố.
- Số lượng phần tử được lưu trữ trong một mảng phải được biết trước.
Tổng kết
- Mảng là một cấu trúc dữ liệu lưu trữ các phần tử có cùng kiểu dữ liệu.
- Các phần tử mảng được lưu trữ tuần tự.
- Các phần tử mảng được biểu thị bằng các chỉ mục tương ứng của chúng. Phần tử đầu tiên có chỉ số 0, trong khi phần tử cuối cùng có chỉ số n-1, ở đây là tổng số phần tử của mảng.
- Việc khai báo một mảng liên quan đến việc xác định kiểu dữ liệu của các phần tử mảng cũng như số phần tử được lưu trữ trong mảng.
- Mảng một chiều lưu trữ các phần tử một cách tuần tự.
- Mảng hai chiều lưu trữ các phần tử theo hàng và cột.
- Mảng ba chiều là một mảng gồm nhiều mảng.
- Các phần tử có thể được thêm vào một mảng bằng cách sử dụng chỉ mục của chúng.
- Các phần tử mảng được truy cập bằng cách sử dụng chỉ mục của chúng.
- Mảng nhiều chiều có nhiều hơn một chiều.
- Tên mảng trỏ đến phần tử đầu tiên của nó.
- Mảng có kích thước cố định, nghĩa là không thể thêm phần tử mới vào mảng sau khi khởi tạo.