II. Truyền tham số mảng cho hàm
4. Mảng con trỏ
Mảng con trỏ cũng tương tự như mảng thông thường, chỉ khác ở chỗ, mỗi phần tử mảng là một con trỏ. Như vậy ta chỉ sử dụng mảng con trỏ để chứa các dịa chỉ chứ không chứa các giá trị như mảng thông thường.
Khai báo: int a[100]: là khai báo biến mảng thông thường a có tối đa 100 phần tử. Mảng a có thể dùng để chứa một dãy số có tối đa 100 phần tử.
Khai báo: int * a[100]: là khai báo biến mảng con trỏ a. Mảng a có tối đa 100 phần tử, mỗi phần tử là một con trỏ. Mảng a có thể dùng để chứa 100 địa chỉ khác nhau.
Cú pháp khai báo: <Kiểu con trỏ> <*> <tên biến mảng> <[số phần tử tối đa]>;
Mảng con trỏ không dùng độc lập mà nó thường được dùng kèm với các biến khác (thường là mảng). Đặc biệt, mảng con trỏ thích hợp trong bài toán về xử lý ma trận thưa.
Xét bài toán có ma trận thưa: Có n xe tải chuyên chở vật liệu. Số liệu từng chuyến của từng xe trong ngày được cho trong bảng sau (VD n=4, đơn vị Tấn) Xe 1 Xe 2 Xe 3 Xe 4 2 3 4 3 4 4 3 5 2 3 4 3 4 3 5
Theo bảng số liệu, xe 1 chở được 3 chuyến/ ngày với tổng cộng 9 tấn, xe 2 chở được 2 chuyến với tổng cộng 7 tấn…
Vấn đề đặt ra là sử dụng kiểu dữ liệu nào để lưu trữ bảng số liệu này. Ta nghĩ ngay đến kiểu mảng. Như vậy mảng số liệu sẽ như sau:
2 3 4 2
4 5 43 3 4 3 5
Ma trận này lãng phí rất nhiều ô nhớ (vì không dùng đến) có thể xem như là một ma trận thưa.
Để khắc phục được tính trạng lãng phí bộ nhớ, ta chuyển sang sử dụng mảng 1 chiều, như vậy, mảng số liệu sẽ là:
2 3 4 3 4 4 3 5 2 3 4 3 4 3 5
Như vậy sẽ tránh được tình trạng lãng phí bộ nhớ. Tuy nhiên, một vấn đề khác nảy sinh là làm thế nào để có được số liệu của xe i (i=1..4) bất kỳ.
Rõ ràng ta cần dùng đến một mảng con trỏ để lưu địa chỉ của phần tử đầu tiên trong dãy các số liệu của từng xe, như vậy thì:
2 3 4 3 4 4 3 5 2 3 4 3 4 3 5
Dựa vào mảng con trỏ này ta có thể lấy được thông tin của từng xe. Sau đây là code của chương trình.
#include "conio.h" #include "iostream.h" #include "stdio.h" void main() { clrscr(); int a[100], n; int *p[50], *q; cout<<"Nhap n"; cin>>n;
//nhap thong tin cho n xe, ket thuc bang so 0. p[0] =q = a;// cho con tro q vaf p[0] tro toi a[0] for (int i=0; i<n; i++)
{
cout<<"Nhap so lieu cho xe "<<i+1<<endl; cin>>*q;
while(*q!=0) {
Biªn so¹n: NguyÔn M¹nh Cêng Trang 7 0
q++; cin>>*q; }
p[i+1]=q; }
//xuat so lieu cua xe bay ky ra man hinh int stt;
cout<<" can xem so lieu cua xe nao "; cin>>stt;//nhap stt thuoc [0..n-1] for (q=p[stt-1]; q<p[stt]; q++)
cout<<*(q)<<" "; getch();
}