Trong bài này, chúng ta cùng xem cách nhập giá trị cho mảng, truy xuất phần tử trong mảng, xem địa chỉ các phần tử trong mảng để thấy chúng là các vùng nhớ liên kề nhau và kỹ thuật truyền mảng cho hàm.
1. Nhập và xuất các phần tử trong mảng một chiều với C++
1.1. Sử dụng vòng lặp for để nhập xuất các phần tử trong mảng
#include <iostream>
using namespace std;
#define MAX 5
int main() {
int arA[MAX];
cout<<"Input array:"<<endl;
for(int i= 0; i< MAX; i++){
cout<<i<<"th element:";
cin >> arA[i];
}
cout<<"Output array:";
for(int i= 0; i< MAX; i++){
cout<<arA[i]<<" ";
}
system("pause");
}
Kết quả
Input array:
0th element:5
1th element:-1
2th element:0
3th element:2
4th element:9
Output array:5 -1 0 2 9
1.2. Gán dữ liệu cho mảng một chiều với C++
Cú pháp
<tên biến mảng> [<chỉ số thứ i>] = <giá trị>;
Chương trình C++ minh họa gán dữ liệu cho mảng
#include <iostream>
using namespace std;
#define MAX 5
int main() {
int arA[MAX] = {5, -1, 0, 2, 9};
cout<<"Output array:";
for(int i= 0; i< MAX; i++){
cout<<arA[i]<<" ";
}
//change value of 0th element in array
arA[0]=99;
cout<<"\nOutput array after changed:";
for(int i= 0; i< MAX; i++){
cout<<arA[i]<<" ";
}
system("pause");
}
Kết quả
Output array:5 -1 0 2 9
Output array after changed:99 -1 0 2 9
Sao chép dữ liệu từ mảng này sang mảng khác
Ví dụ: Cho hai mảng số nguyên arA, arB có kích thước MAX = 5 phần tử.
int arA[MAX] = {5, -1, 0, 2, 9};
int arB[MAX];
Muốn gán dữ liệu mảng arA cho mảng arB thì không thể dùng lệnh:
arB=arA;//error: '=' : left operand must be l-value
Phải gán trực tiếp lần lượt các phần tử của mảng arA cho mảng arB.
#include <iostream>
using namespace std;
#define MAX 5
int main() {
int arA[MAX] = {5, -1, 0, 2, 9};
int arB[MAX];
cout<<"Output arB (arB store garbage values due to is not initialization):\n";
for(int i= 0; i< MAX; i++){
cout<<arB[i]<<" ";
}
//copy arA to arB
for(int i= 0; i< MAX; i++){
arB[i]=arA[i];
}
cout<<"\nOutput arB (arB store elements of arA):\n";
for(int i= 0; i< MAX; i++){
cout<<arB[i]<<" ";
}
system("pause");
}
Kết quả
Output arB (arB store garbage values due to is not initialization):
-858993460 -858993460 -858993460 -858993460 -858993460
Output arB (arB store elements of arA):
5 -1 0 2 9
2. Địa chỉ của các phần tử trong mảng
Mảng một chiều là tập hợp tuần tự các phần tử có cùng kiểu dữ liệu và các phần tử được lưu trữ trong một dãy các ô nhớ liên tục trên bộ nhớ.
Chúng ta sẽ viết chương trình in địa chỉ của các phần tử trong mảng (dùng toán tử &) để kiểm chứng việc này.
#include <iostream>
using namespace std;
#define MAX 5
int main() {
int arA[MAX] = {5, -1, 0, 2, 9};
cout<<"Address of elements in array:"<<endl;
for(int i= 0; i< MAX; i++){
cout<<&arA[i]<<" ";
}
system("pause");
}
Kết quả
Address of elements in array:
00CFF924 00CFF928 00CFF92C 00CFF930 00CFF934
Địa chỉ của các phần tử trong mảng được biểu diễn dưới dạng hệ cơ số 16 (hexadecimal). Chúng ta chuyển đổi chúng sang hệ cơ số 10 (decimal) xem sao:
13629732 13629736 13629740 13629744 13629748
Rõ ràng, các địa chỉ này cách nhau 4 đơn vị tương ứng với 4 ô nhớ. Kiểu dữ liệu của các phần tử trong mảng arA là int, mà int thì chiếm 4 byte tương ứng 4 ô nhớ. Vậy thì rõ ràng các phần tử trong mảng được cấp phát và lưu trữ trong các ô nhớ liên tục nhau.
Điều gì xảy ra khi truy xuất mảng với “chỉ mục” vượt quá <số phần tử> tối đa
#include <iostream>
using namespace std;
#define MAX 5
int main() {
int arA[MAX] = {5, -1, 0, 2, 9};
cout<<"Address of elements in array:"<<endl;
for(int i= 0; i< MAX+2; i++){//access more elements outside the array
cout<<&arA[i]<<" ";
}
system("pause");
}
Kết quả
Address of elements in array:
00CFF924 00CFF928 00CFF92C 00CFF930 00CFF934 00CFF938 00CFF93C
Chúng ta đổi địa chỉ qua hệ cơ số 10:
13629732 13629736 13629740 13629744 13629748 13629752 13629756
Dữ liệu của các phần tử được xuất ra:
5 -1 0 2 9 -858993460 1319298504
Nhận xét: Rõ ràng, các phần tử ngoài mảng có địa chỉ ô nhớ liên tục với các ô nhớ trong mảng và chúng chứa địa chỉ rác.
Lưu ý: Mỗi lần chạy chương trình, địa chỉ các ô nhớ trong mảng sẽ thay đổi.
3. Truyền mảng cho hàm
Mảng có thể được truyền vào hàm như là các tham số. Các mảng luôn được truyền con trỏ (pass by pointer) vào hàm. Nó tương tự truyền tham chiếu, có nghĩa là các mảng có thể thay đổi giá trị bởi lời gọi hàm.
Chương trình C++ minh họa truyền mảng cho hàm
#include <iostream>
using namespace std;
#define MAX 5
void changeArray(int a[]){
a[0]=99;
}
int main() {
int arA[MAX] = {5, -1, 0, 2, 9};
cout<<"Output arA array before change:"<<endl;
for(int i= 0; i< MAX; i++){
cout<<arA[i]<<" ";
}
//call changeArray(int a[]) function
changeArray(arA);
cout<<"\nOutput arA array after change:"<<endl;
for(int i= 0; i< MAX; i++){
cout<<arA[i]<<" ";
}
system("pause");
}
Kết quả
Output arA array before change:
5 -1 0 2 9
Output arA array after change:
99 -1 0 2 9
4. Một số bài tập về mảng
Dựa vào những kỹ thuật lập trình trên mảng một chiều đã trình bày, các bạn hãy tự làm những bài tập cơ bản sau đây nhé!
– Tìm xem phần tử x có nằm trong mảng a kích thước n hay không? Nếu có thì nó nằm ở vị trí nào?
– Cho trước mảng a, số lượng phần tử na. Tách các số nguyên tố có trong mảng a vào mảng b.
– Cho trước mảng a, số lượng phần tử na và mảng b số lượng phần tử nb. Gộp 2 mảng trên theo tứ tự đó thành mảng c, số lượng phần tử nc.
– Cho trước mảng a có n phần tử. Tìm giá trị lớn nhất trong mảng a (gọi là max).
– Cho trước mảng a kích thước n. Hãy sắp xếp mảng a đó sao cho các phần tử có giá trị tăng dần.