- Nếu a[M] < c thì gọi đề quy trên đoạn [M+1, R] B2:
a. Con trỏ và mảng một chiều
Như đã biết, các phần tử của mảng có thể được xác định thông qua chỉ số. Ví dụ phần tử thứ nhất là a[0], phần tử thứ 2 là a[1]…
Ta còn có cách thứ 2 để xác định các phần tử của mảng, không phải thông qua các chỉ số mà thông qua con trỏ.
Khi khai báo một mảng a gồm 10 phần tử, máy tính sẽ cấp phát 10 ô nhớ liên tiếp nhau.
Điều đặc biệt là: địa chỉ của phần tử đầu tiên của mảng được chứa trong tên mảng. Như vậy a tương đương với &a[0] và tên mảng tương đương với một con trỏ chứa địa chỉ của phần tử đầu tiên của mảng.
Ta có:
a chứa địa chỉ &a[0]. a+i chứa địa chỉ &a[i].
Biªn so¹n: NguyÔn M¹nh Cêng Trang 6 8
Như vậy, nếu p là con trỏ cùng kiểu ta có thể gán: p = a; và khi đó:
a[i] = p[i] = *(a+i) = *(p+i);
Thay bằng truy cập tới phần tử thứ i+1 của mảng qua a[i] ta có thể viết p[i] hoặc *(a+i) hoặc *(p+i).
VD1: float a[4]; float a[4]; a[0] = 0; a[1] = 1; a[2] = 2; a[3] = 3; cout<<a[3]; cout<<*(a+3); float *p; p = a; cout<<p[3]; cout<<*(p+3); getch(); }
VD2: Nhập vào một mảng 4 số nguyên và tính tổng của các số
đó.
Cách 1:
void main() {
float a[4];
for (int i=0; i<4; i++) {
cout<<”Nhập a[“<<i<<”]”; cin>>a[i];
}
float T=0;
for(i=0; i<4; i++) T+=*(a+i); cout<<”Tổng bằng”<<T; getch(); } Cách 2: void main() { float a[4], *p;
for (int i=0; i<4; i++) {
cout<<”Nhập a[“<<i<<”]”; cin>>a[i];
}
p=a; float T=0; for(i=0; i<4; i++)
T+=p[i]; cout<<”Tổng bằng”<<T; getch(); } Cách 3: void main() { float a[4], *p;
for (int i=0; i<4; i++) { cout<<”Nhập a[“<<i<<”]”; cin>>a[i]; } p=a; float T=0;
for(i=0; i<4; i++) T+=*(p+i);
cout<<”Tổng bằng”<<T; getch();
}
Do tên mảng cũng tương đương với một con trỏ nên khi p là một con trỏ kiểu nguyên, ta có thể khai báo int *p; nhưng cũng có thể khai báo như một mảng hình thức: int p[]. Mặt khác, thậm chí ta có thể sử dụng con trỏ p như một mảng. Hàm Sum2() sau sẽ sử dụng con trỏ a như một mảng.
VD: Viết hàm tính tổng các phần tử của mảng 4 phần tử.
double Sum1(double a[]) {
double T=0;
for(int i=0; i<4; i++) T+=a[i];
return T; }
double Sum2(double *a) {double T=0;
for(int i=0; i<4; i++) T+=a[i];
Biªn so¹n: NguyÔn M¹nh Cêng Trang 7 0
return T; } void main() { double *b; b[0] = 1; b[1] = 3; b[2] = 2; b[3] = 5; cout<<”Tổng thứ nhất”<<Sum1(b); cout<<”Tổng thứ hai”<<Sum2(b); getch(); }