Như tôi đã nói ở trên, mảng có thể được khai báo theo kiểu truyền thống hoặc theo cấu trúc con trỏ. Ví dụ, tôi có một mảng số nguyên, chúng có 20 phần tử
int numbers[20]; //Khai báo truyền thống int *p = new int[20]; //Khai báo con trỏ
Hoặc ta có khai báo một biến xâu kí tự theo một trong 3 cách sau char xau[20]; //Khai báo truyền thống
char *xau; //Khai báo con trỏ string xau;//Khai báo xâu
C
+
+
Khởi tạo giá trị cho con trỏ khi nó đóng vai trò là mảng
Thứ nhất: ta sử dụng phép gán để sao chép toàn bộ mảng lên con trỏ
p = numbers;//p là con trỏ, numbers là mảng
Thứ hai: khởi tạo trực tiếp cho từng phần tử
int *p;
for (int i=0; i<20; i++){ *(p+i)=numbers[i]; }
Chương trình nhập – xuất dữ liệu bằng việc sử dụng con trỏ.
Chương trình Kết quả
#include<iostream> using namespace std;
void Input(int *p, int length) {
for (int i=0; i<length; i++){ cin>>*(p+i);
} }
void Output(int *p, int length) {
for (int i=0; i<length; i++){ cout<<*(p+i)<<” “; } } int main() { int *a; int lengtha; cout<<”Nhap do dai: “; cin>>lengtha; Input(a, lengtha); cout<<”========”<<endl; Output(a, lengtha); return 0; } Nhap do dai: 4 6 8 9 0 ======== 6 8 9 0
Giải thích: biến con trỏ luôn được truyền theo kiểu tham biến, do đó, chúng ta
không cần bổ sung dấu & vào bên trước tên biến. Hàm Input dùng để nhập
mảng số nguyên có độ dài length, hàm Output dùng để xuất dữ liệu từ mảng nguyên đó. Khi truy xuất từ biến con trỏ, ngoài cách xuất như trên, ta còn có thể
C
+
+
viết p[i] tương ứng như mảng – p[i] và *(p+i) đều là phần tử thứ i. Nghĩa là ta hoàn toàn có thể viết
cin>>p[i]; cout<<p[i]; cin>>*(p+i); cout<<*(p+i);
int c = p[i]+q[j]; int c = *(p+i)+*(q+j);
Việc sử dụng con trỏ để thay cho xâu cũng hoàn toàn tương tự. Nhưng hãy lưu ý, phần tử cuối cùng của nó là phần tử \0.