Trong bài viết Mảng (array) trong C++ (phần 1) Taimienphi.vn đã giới thiệu cho bạn về mảng và khai báo mảng trong C++ là gì. Trong bài C++ hôm nay, Taimienphi.vn sẽ giới thiệu tiếp cho bạn về khởi tạo mảng (array) trong C++.
Để tìm hiểu thêm các thông tin về khởi tạo mảng (array) trong C++, con trỏ tới mảng là gì, bạn đọc cùng tham khảo tiếp bài viết dưới đây của Taimienphi.vn. Ngoài ra bạn đọc có thể tham khảo thêm bài viết mảng (array) trong C++ (phần 1) để tìm hiểu thêm về khai báo mảng trong C++ như thế nào nhé.
1. Khởi tạo mảng trong C++
Cấu trúc khởi tạo mảng có dạng int n[ ]={ 2,4,8 };
Nhưng khi khai báo một mảng, chẳng hạn như int n[3];, chúng ta cần gán các giá trị cho mảng một cách riêng biệt. Vì "int n[3];" sẽ phân bổ bộ nhớ cho 3 số nguyên, nhưng không có số nguyên nào trong đó.
Để gán giá trị cho mảng, chúng ta gán giá trị cho từng phần tử của mảng một.
n[0] = 2;
n[1] = 4;
n[2] = 8;
Tương tự như cách chúng ta đang khai báo các biến, sau đó gán các giá trị cho các biến đó.
int x,y,z;
x=2;
y=4;
z=8;
Vì vậy có 2 cách để khởi tạo một mảng, bao gồm:
int n[ ]={ 2,4,8 };
Và cách thứ 2 là khai báo mảng, sau đó gán giá trị cho từng phần tử trong mảng đó:
int n[3];
n[0] = 2;
n[1] = 4;
n[2] = 8;
Để dễ hình dung hơn, chúng ta coi n[0], n[1] và n[2] là các biến khác nhau mà chúng ta đã sử dụng trước đây.
Cũng giống như một biến, một mảng có thể là kiểu dữ liệu bất kỳ.
float f[ ]= { 1.1, 1.4, 1.5};
Ở đây, f là mảng của float.
- Ví dụ 1:
Trước hết chúng ta cần xem ví dụ tính điểm trung bình cho 3 học sinh. Ở đây, điểm[0], điểm[1], điểm[2], tương ứng với số điểm của học sinh thứ nhất, thứ hai và thứ ba.
#include
int main(){
sử dụng namespace std;
int marks[3];
float trung binh;
cout < "nhập="" số="" điểm="" của="" học="" sinh="" thứ="" nhất"=""><>
cin >> điểm[0];
cout < "nhập="" số="" điểm="" của="" học="" sinh="" thứ="" hai"=""><>
cin >> điểm[1];
cout < "nhập="" số="" điểm="" của="" học="" sinh="" thứ="" ba"=""><>
cin >> điểm[2];
trung bình = ( điểm[0] + điểm[1] + điểm[2] )/ 3.0;
cout < "điểm="" trung="" bình="" :="" "="">< average=""><>
trả về 0;
}
Kết quả đầu ra có dạng:
Nhập số điểm của học sinh thứ nhất
23
Nhập số điểm của học sinh thứ hai
25
Nhập số điểm của học sinh thứ ba
31
Điểm trung bình : 26.3333
Trong ví dụ trên chúng ta xử lý mảng theo cách tương tự như xử lý các biến thông thường. Ngoài ra cần lưu ý 2 điểm:
- Giá trị trung bình phải là kiểu dữ liệu float vì giá trị trung bình của số nguyên cũng có thể là float.
- Khi tính điểm số trung bình, tổng các số phải cho cho 3.0 chứ không phải là 3, nếu không giá trị điểm trung bình mà bạn nhận được không phải kiểu float.
- Ví dụ 2: Trong ví dụ này chúng ta sử dụng vòng lặp:
#include
int main(){
sử dụng namespace std;
int n[10]; /* khai báo n là mảng của 10 số nguyên */
int i,j;
/* khởi tạo các phần tử của n */
for ( i = 0; i<10; i++="">
{
cout < "nhập="" giá="" trị="" của="" n["="">< i=""><><>
cin >> n[i];
}
/* in các giá trị của phần tử mảng */
for (j = 0; j < 10;="" j++="">
{
cout < "n["="">< j="">< "]=" << n[j] << endl;
}
Trả về 0;
}
- Kết quả đầu ra có dạng:
Nhập giá trị của n[0]
23
Nhập giá trị của n[1]
25
Nhập giá trị của n[2]
31
Nhập giá trị của n[3]
1
Nhập giá trị của n[4]
33
Nhập giá trị của n[5]
35
Nhập giá trị của n[6]
76
Nhập giá trị của n[7]
47
Nhập giá trị của n[8]
74
Nhập giá trị của n[9]
45
n[0] = 23
n[1] = 25
n[2] = 31
n[3] = 1
n[4] = 33
n[5] = 35
n[6] = 76
n[7] = 47
n[8] = 74
n[9] = 45
Trong chương trình trên, mã khá đơn giản, I và j bắt đầu từ 0 vì chỉ số mảng bắt đầu từ 0 và tăng lên 9 (cho 10 phần tử). Vì vậy i và j chỉ tăng lên đến 9 chứ không phải 10 (i <10 và j <10). Vì vậy, trong đoạn mã trên, n [i] sẽ là n [0], n [1], n [2], ...., n [9].
Ngoài ra trong ví dụ trên chúng ta sẽ thấy có 2 vòng lặp. Trong vòng lặp for đầu tiên, chúng ta lấy các giá trị của phần tử khác nhau của từng mảng một. Trong vòng lặp thứ 2, chúng ta in các giá trị của phần tử mảng.
Trong lần lặp đầu tiên, giá trị của i là 0, vì vậy n[i] là n[0]. Vì vậy bằng cách viết cin >> n[i];, người dùng sẽ được yêu cầu nhập giá trị của n[0]. Tương tự trong lần lặp thứ 2, giá trị của i sẽ là 1 và n [i] sẽ là n [1]. Vì vậy cin >> n[i]; sẽ được sử dụng để nhập giá trị từ người dùng cho n[1], ... . Giá trị của i sẽ tăng lên 9 và các chỉ số của mảng (0,1,2, ..., 9).
Mảng phân bổ bộ nhớ liền kề. Vì vậy nếu địa chỉ của phần tử đầu tiên của một mảng số nguyên là X, thì địa chỉ của phần tử thứ 2 sẽ là X + 4 (4 là kích thước của số nguyên)) và phần tử thứ ba sẽ là X + 4 + 4, ... . Tức là bộ nhớ của tất cả các phần tử của một mảng được phân bổ cùng nhau và liên tục.
2. Con trỏ tới mảng
Tiếp theo chúng ta sẽ cùng tìm hiểu cách truyền con trỏ tới mảng. Trước khi bắt đầu, giả định chúng ta đã truy cập con trỏ.
Nếu chưa biết, con trỏ là một biến có giá trị là địa chỉ của một số biến khác, chẳng hạn nếu một biến y trỏ đến biến x khác, tức là giá trị của biến y là địa chỉ của biến x.
Tương tự nếu một biến y trỏ đến một mảng n, tức là giá trị của biến y là địa chỉ của phần tử đầu tiên của mảng, tức n[0]. Vì vậy y là con trỏ tới mảng n. Tên mảng là con trỏ đến phần tử đầu tiên của mảng.
Nếu p là con trỏ tới mảng tuổi, tức là p (hoặc tuổi) trỏ đến tuổi[0].
int tuổi[50];
int *p;
p = tuổi;
Trong đoạn mã trên gán địa chỉ của phần tử đầu tiên của tuổi cho p. Vì p trỏ đến phần tử đầu tiên của mảng tuổi, *p là giá trị của phần tử đầu tiên của mảng.
Vì *p đề cập đến phần tử mảng đầu tiên, *(p+1) và *(p+2) tương ứng với các phần tử thứ 2 và thứ 3, ... . Vì vậy *p là tuổi[0], *(p + 1) là tuổi[0], *(p + 2) là tuổi[0], ....
Tương tự, *tuổi là tuổi[0] (giá trị của tuổi), *(tuổi+1) là tuổi[1] giá trị của tuổi+1 ), *(tuổi+2) là tuổi[2] ( giá trị của tuổi+2 ), ... .
Trên đây là các thông tin về con trỏ đến mảng trong C++. Cùng tham khảo ví dụ dưới đây để hiểu rõ hơn về con trỏ đến mảng:
#include
int main(){
float n[5] = { 20.4, 30.0, 5.8, 67, 15.2 }; /* khai báo n là mảnh của 5 float */
float *p; /* p là con trỏ của float */
int i;
p = n; /* p trỏ tới mảng n */
/* in giá trị các phần tử của mảng */
for (i = 0; i < 5;="" i++="">
{
std::cout < "*(p="" +="" "="">< i="">< ")=" << *(p + i) << std::endl;/* *(p+i) là giá trị của (p+0),(p+1)...*/
}
Trả về 0;
}
Kết quả đầu ra có dạng:
*(p + 0) = 20.4
*(p + 1) = 30
*(p + 2) = 5.8
*(p + 3) = 67
*(p + 4) = 15.2
Vì p đang trỏ đến phần tử đầu tiên của mảng, vì vậy *p hoặc *(p+0) tương ứng với giá trị tại p[0] hoặc giá trị tại phần tử đầu tiên của p. Tương tự, *(p+1) tương ứng với giá trị tại p[1]. Vì vậy *(p+3) và *(p+4) tương ứng với các giá trị tại p[3] và p[4].
Ví dụ trên tổng hợp tất cả các khái niệm. Cuối cùng in địa chủ các mảng và từng phần tử của mảng.
#include
int main(){
int n[4] = { 20, 30, 5, 67 }; /* khai báo n là mảng của 4 số nguyên*/
int *p; /*con trỏ */
int i;
p = n; /*p trỏ tới mảng n*/
/* in địa chỉ của mảng */
std::cout << " address="" of="" array="" n=" << p << std::endl; /*p trỏ tới mảng tức là lưu trữ địa chỉ của phần tử đầu tiên của mảng*/
/* in địa chỉ các phần tử của mảng */
for (i = 0; i < 4; i++ )
{
std::cout << " address="" of="" n["="">< i="">< "]=" << &n[i] << std::endl;
}
trả về 0;
}
đầu ra có dạng:
địa chỉ của mảng n = 0xfffe2c0c
địa chỉ của n[0] = 0xfffe2c0c
địa chỉ của n[1] = 0xfffe2c10
địa chỉ của n[2] = 0xfffe2c14
địa chỉ của n[3] = 0xfffe2c18
trong ví dụ trên, địa chỉ của phần tử đầu tiên của n và p giống nhau. ngoài ra chúng ta in các giá trị của các phần tử khác nhau của mảng bằng cách sử dụng (p + 1), (p + 2) và (p + 3).
như vậy trong bài viết mảng (array) trong c++ (phần 1) trên đây taimienphi.vn vừa giới thiệu cho bạn về khởi tạo mảng cũng như con trỏ tới mảng trong c++. trong bài viết mảng (array) trong c++ (phần 3) tiếp theo taimienphi.vn sẽ giới thiệu tiếp cho bạn về cách truyền toàn bộ mảng trong hàm, cũng như vòng lặp for - each là gì.
" ]="">{C}{C}{C}{C}{C}
}
trả về 0;
}
đầu ra có dạng:
địa chỉ của mảng n = 0xfffe2c0c
địa chỉ của n[0] = 0xfffe2c0c
địa chỉ của n[1] = 0xfffe2c10
địa chỉ của n[2] = 0xfffe2c14
địa chỉ của n[3] = 0xfffe2c18
trong ví dụ trên, địa chỉ của phần tử đầu tiên của n và p giống nhau. ngoài ra chúng ta in các giá trị của các phần tử khác nhau của mảng bằng cách sử dụng (p + 1), (p + 2) và (p + 3).
https://thuthuat.taimienphi.vn/mang-array-trong-c-phan-2-45806n.aspx
như vậy trong bài viết mảng (array) trong c++ (phần 1) trên đây taimienphi.vn vừa giới thiệu cho bạn về khởi tạo mảng cũng như con trỏ tới mảng trong c++. trong bài viết mảng (array) trong c++ (phần 3) tiếp theo taimienphi.vn sẽ giới thiệu tiếp cho bạn về cách truyền toàn bộ mảng trong hàm, cũng như vòng lặp for - each là gì, đón đọc mảng trong C phần 3 được trình bày chi tiết về nội dung này
10;>