Giữa mảng và con trỏ có một sự liên hệ rất chặt chẽ. Những phần tử của mảng có thểđược xác định bằng chỉ số trong mảng, bên cạnh đó chúng cũng có thểđược xác lập qua biến con trỏ.
III.1.1 Truy cập các phần tử mảng theo dạng con trỏ
Ta có các quy tắc sau:
&<Tên mảng>[0] tương đương với <Tên mảng>
&<Tên mảng> [<Vị trí>] tương đương với <Tên mảng> + <Vị trí> <Tên mảng>[<Vị trí>] tương đương với *(<Tên mảng> + <Vị trí>)
Ví dụ: Cho 1 mảng 1 chiều các số nguyên a có 5 phần tử, truy cập các phần tử theo kiểu mảng và theo kiểu con trỏ.
#include <stdio.h> #include <conio.h>
/* Nhập mảng bình thường*/ void NhapMang(int a[], int N){ int i;
for(i=0;i<N;i++) {
printf("Phan tu thu %d: ",i);scanf("%d",&a[i]); }
}
/* Nhập mảng theo dạng con trỏ*/ void NhapContro(int a[], int N) {
int i;
for(i=0;i<N;i++){
printf("Phan tu thu %d: ",i);scanf("%d",a+i); } } int main() { int a[20],N,i; clrscr();
printf("So phan tu N= ");scanf("%d",&N); NhapMang(a,N); /* NhapContro(a,N)*/ printf("Truy cap theo kieu mang: "); for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\nTruy cap theo kieu con tro: "); for(i=0;i<N;i++) printf("%d ",*(a+i)); getch(); return 0; } Kết quả thực thi của chương trình:
III.1.2 Truy xuất từng phần tửđang được quản lý bởi con trỏ theo dạng mảng
<Tên biến>[<Vị trí>] tương đương với *(<Tên biến> + <Vị trí>) &<Tên biến>[<Vị trí>] tương đương với (<Tên biến> + <Vị trí>)
Trong đó <Tên biến> là biến con trỏ, <Vị trí> là 1 biểu thức số nguyên.
Ví dụ: Giả sử có khai báo: #include <stdio.h> #include <alloc.h> #include <conio.h> int main(){ int *a; int i; clrscr(); a=(int*)malloc(sizeof(int)*10); for(i=0;i<10;i++) a[i] = 2*i;
printf("Truy cap theo kieu mang: "); for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\nTruy cap theo kieu con tro: "); for(i=0;i<10;i++) printf("%d ",*(a+i)); getch(); return 0; } Kết quả chương trình:
Với khai báo ở trên, hình ảnh của con trỏ a trong bộ nhớ:
0 1 2 3 4 5 6 7 8 9
0 2 4 6 8 10 12 14 16 18
a 2 byte
III.1.3 Con trỏ chỉ đến phần tử mảng
Giả sử con trỏ ptr chỉđến phần tử a[i] nào đó của mảng a thì:
ptr + j chỉđến phần tử thứ j sau a[i], tức a[i+j] ptr - j chỉđến phần tửđứng trước a[i], tức a[i-j]
Ví dụ: Giả sử có 1 mảng mang_int, cho con trỏ contro_int chỉđến phần tử thứ 5 trong mảng. In ra các phần tử của contro_int & mang_int.
#include <conio.h> #include <alloc.h> int main() { int i,mang_int[10]; int *contro_int; clrscr(); for(i=0;i<=9;i++) mang_int[i]=i*2; contro_int=&mang_int[5];
printf("\nNoi dung cua mang_int ban dau="); for (i=0;i<=9;i++)
printf("%d ",mang_int[i]);
printf("\nNoi dung cua contro_int ban dau ="); for (i=0;i<5;i++)
printf("%d ",contro_int[i]); for(i=0;i<5;i++)
contro_int[i]++;
printf("\n---"); printf("\nNoi dung cua mang_int sau khi tang 1=");
for (i=0;i<=9;i++)
printf("%d ",mang_int[i]);
printf("\nNoi dung cua contro_int sau khi tang 1="); for (i=0;i<5;i++) printf("%d ",contro_int[i]); if (contro_int!=NULL) free(contro_int); getch(); return 0; } Kết quả chương trình
III.2 Con trỏ và mảng nhiều chiều
Ta có thể sử dụng con trỏ thay cho mảng nhiều chiều như sau: Giả sử ta có mảng 2 chiều và biến con trỏ như sau:
int a[n][m]; int *contro_int;
Thực hiện phép gán contro_int=a;
Khi đó phần tử a[0][0] được quản lý bởi contro_int; a[0][1] được quản lý bởi contro_int+1; a[0][2] được quản lý bởi contro_int+2; ...
a[1][0] được quản lý bởi contro_int+m; a[1][1] được quản lý bởi contro_int+m+1; ...
a[n][m] được quản lý bởi contro_int+n*m;
Ví dụ: Sự tương đương giữa mảng 2 chiều và con trỏ. #include <stdio.h> #include <conio.h> #include <alloc.h> int main() { int i,j; int mang_int[4][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14, 15,16,17,18,19,20}; int *contro_int; clrscr(); contro_int=(int*)mang_int;
printf("\nNoi dung cua mang_int ban dau="); for (i=0;i<4;i++) { printf("\n"); for (j=0;j<5;j++) printf("%d\t",mang_int[i][j]); } printf("\n---"); printf("\nNoi dung cua contro_int ban dau \n"); for (i=0;i<20;i++)
printf("%d ",contro_int[i]); for(i=0;i<20;i++)
contro_int[i]++ ;
printf("\n---"); printf("\nNoi dung cua mang_int sau khi tang 1=");
for (i=0;i<4;i++) { printf("\n"); for (j=0;j<5;j++) printf("%d\t",mang_int[i][j]); }
printf("\nNoi dung cua contro_int sau khi tang 1=\n"); for (i=0;i<20;i++) printf("%d ",contro_int[i]); if (contro_int!=NULL) free(contro_int); getch(); return 0; } Kết quả thực hiện chương trình như sau: