Con trỏ và mảng Con trỏ và mảng một chiều Trong C mảng là một hằng con trỏ, do đó các thao tác đối với mảng đều có thể được thông qua con trỏ.
Trang 13 Con trỏ và mảng
Con trỏ và mảng một chiều
Trong C mảng là một hằng con trỏ, do đó các thao tác đối với mảng đều có thể được thông qua con trỏ
Chúng ta xét một số ví dụ về việc khai báo và sử dụng con trỏ và mảng như sau:
int a[10]; à 10 đối tượng a[0]…a[9] được tạo ra
int *pa; thì pa à ? Nếu pa=a;
Thì pa trỏ tới mảng a và cũng là trỏ tới phần tử đầu tiên của mảng a
Nếu pa=&a[0];
Thì pa trỏ tới phần tử đầu tiên của mảng a
*(pa+1): nội dung của a[1]
pa+1 : trỏ tới phần tử tiếp theo pa-i: trỏ tới phần tử i trước pa
*(pa+i): nội dung của a[i]
Ví dụ: Chúng ta xét đoạn chương trình sau để thấy rõ hơn mối quan hệ giữa con trỏ và mảng
void main(){
int *pointer, a[10],i;
for(i=0;i<10;i++){
printf("a[%d]=",i); scanf("%d",&a[i]);
} pointer=&a[0]; // pointer=a for(i=0;i<10;i++)
printf("a[%d]=\t%d con tro :%d",i,a[i],*(pointer+i));
getch();
}
Con trỏ và mảng nhiều chiều
Khi đề cặp đến mảng, chúng ta có từng tự hỏi mảng có địa chỉ không ?, nếu có thì địa chỉ của mảng
là gì ?
Thì câu trả lời là: Có và địa chỉ của mảng chính là tên mảng
Ví dụ mảng int A[3][3]
thì đia chỉ là A
Xét mảng sau: A[5][5]
o Địa chỉ đầu: A=A[0]=*(A+0)=&A[0][0]
o Địa chỉ hàng thứ nhất: A[1]=*(A+1)=&A[1][0]
o Địa chỉ hàng thứ i: A[i]=*(A+i)=&A[i][0]
o Địa chỉ phần tử A[i][j]: (*(A+i)+j)
o Nội dung phần tử A[i][j]: *(*(A+i)+j)
Để hiểu rõ hơn về mảng và con trỏ nhiều chiều chúng ta xét đoạn lệnh sau:
void main(){
float A[3][3];
int i,j;
clrscr();
printf("Dia chi cac hang: \n");
for(i=0;i<3;i++)
printf(" %d = %p \t",i,A[i]);
printf("\n");
for(i=0;i<3;i++)
printf(" %d = %p \t",i,*(A+i));
printf("\nDia chi cac phan tu\n" );
Trang 2for(j=0;j<3;j++) printf("[%d][%d] = %p \t",i,j,(*(A+i)+j));
printf("\n\n");
for(i=0;i<3;i++)
for(j=0;j<3;j++) printf("[%d][%d] = %p \t",i,j,(*(A+i)+j));
getch();
}
4 Con trỏ và tham số hình thức của hàm
Để thay đổi trực tiếp nội dung của biến trong hàm thì đối của hàm phải là một con trỏ Đối với những
biến có kiểu cơ bản, chúng ta sử dụng toán tử &<tên biến> để truyền địa chỉ của biến cho hàm như trong ví
dụ đổi nội dung của biến x và y trong hàm swap(&x, &y) như sau:
void swap(int *px, int *py){
int temp
temp=*px;
*px=*py;
*py=temp;
}
Khi chúng ta muốn viêt một hàm để lấy kết quả trả về, nhưng số kết quả trả về là nhiều hơn một thì chúng ta có thể giải quyết bằng cách sử dụng các con trỏ làm tham số hình thức của hàm