1. Con Trỏ Và Mảng
Giá trị của mảng chính là địa chỉ phần tử đầu tiên trong mảng, ví dụ mảng A[] = {3, 8, 4, 2, 9} thì A[] có giá trị là địa chỉ của A[0]
Tên mảng chính là một hằng con trỏ và bạn không thể thay đổi được
Mảng 1 chiều A[] thì con trỏ trỏ tới phần tử A[i] là A + i, vậy (A + i) tương đương với &A[i] hay địa chỉ của A[i] và *(A + i) tương đương với A[i]
Ví dụ 1 : Sử dụng mảng thông qua con trỏ
#include "stdio.h" #include "stdlib.h" int main(){ int n = 5; int a[5] = {3, 8, 4, 2, 9}; printf("Gia tri cua a : %d\n", a); for(int i = 0; i < n; i++){ printf("Dia chi cua a[%d] : %d\n", i, a + i); // a + i <=> &a[i] } printf("Mang a : "); for(int i = 0; i < n; i++){ printf("%d ", *(a + i)); } return 0; }
Output :
Gia tri cua a : 6487520 Dia chi cua a[0] : 6487520 Dia chi cua a[1] : 6487524 Dia chi cua a[2] : 6487528 Dia chi cua a[3] : 6487532 Dia chi cua a[4] : 6487536 Mang a : 3 8 4 2 9
Trong mảng 1 chiều thì bạn có thể sử dụng một con trỏ để trỏ tới các phần tử trong mảng và sử dụng các toán tử ++, -- hoặc +, - để di chuyển con trỏ qua lại các ô nhớ trong mảng
Lưu ý giúp mình rằng bạn có thể sử dụng một con trỏ khác để di chuyển qua lại trong mảng nhưng không thể di chuyển hằng con trỏ mảng.
Ví dụ 2 :
#include "stdio.h" #include "stdlib.h" int main(){ int n = 5; int a[5] = {3, 8, 4, 2, 9}; int *ptr = &a[0]; for(int i = 0; i < n; i++){ printf("%d ", *(ptr + i)); } printf("\n"); ++ptr; // => a[1] printf("%d\n", *ptr); ptr+= 2; // a[3] printf("%d\n", *ptr); --ptr; // a[2] printf("%d\n", *ptr); return 0; }
Output :
3 8 4 2 9 8 2 4
Ví dụ 3 :
#include "stdio.h" #include "stdlib.h" int main(){ int n = 10; int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int *ptr = &a[3]; ptr += a[2]; // ptr += 3 => a[6] printf("%d %d %d\n", ptr, &a[6], *ptr); --ptr; // a[5] printf("%d %d %d\n", ptr, &a[5], *ptr); return 0; }
Output :
6487560 6487560 7 6487556 6487556 6
Xem thêm bài giảng về Con Trỏ của mình :