II. Truyền tham số mảng cho hàm
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].
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;
Biªn so¹n: NguyÔn M¹nh Cêng Trang 6 6
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]; 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();
}