Cho đến bây giờ trong loạt bài hướng dẫn lập trình C đang diễn ra này, chúng ta đã thảo luận ngắn gọn về những điều cơ bản của con trỏ. Tuy nhiên, vẫn còn một số khái niệm liên quan đến con trỏ khác cần được thảo luận. Vì vậy, trong hướng dẫn này, chúng ta sẽ thảo luận về khái niệm con trỏ và mảng.
Trước khi bắt đầu với con trỏ và mảng, chúng ta hãy nhanh chóng làm mới lại khái niệm cơ bản về chính con trỏ. Con trỏ là một loại biến đặc biệt có thể chứa địa chỉ. Ví dụ, con trỏ 'ptr' tới một ký tự có thể được khai báo theo cách sau;
Và bạn có thể sử dụng dấu thăng để lưu trữ địa chỉ vào đó. Đây là một ví dụ:
Vậy bây giờ, con trỏ 'ptr' chứa địa chỉ của biến 'c'. Ngoài ra, bạn cũng có thể nói rằng 'ptr' hiện trỏ đến biến 'c'.
Để truy cập hoặc thao tác giá trị của biến được trỏ đến bởi con trỏ, bạn có thể sử dụng toán tử *. Ví dụ, để thay đổi giá trị của biến c từ 'a' thành 'b', bạn có thể sử dụng con trỏ 'ptr' theo cách sau:
Chương trình sau đây sẽ giúp bạn hiểu rõ hơn về các khái niệm cơ bản về con trỏ mà chúng ta đã thảo luận cho đến nay:
Đây là đầu ra của chương trình này:
Vì vậy, bạn có thể thấy khi sử dụng con trỏ, giá trị của biến đã được thay đổi.
Tại đây, con trỏ 'ptr' trỏ đến phần tử đầu tiên của mảng 'arr', nếu bạn nói theo thuật ngữ chỉ mục, thì nằm ở vị trí số không của mảng. Bây giờ, bạn có thể sử dụng toán tử * với 'ptr' để truy cập/xử lý giá trị mà con trỏ đang trỏ tới.
Tiếp theo, khi bạn có một con trỏ trỏ đến phần tử đầu tiên của một mảng, bạn cũng có thể dễ dàng truy cập các phần tử khác của mảng. Ví dụ, nếu - trong ngữ cảnh của đoạn trích mã ở trên - bạn sử dụng biểu thức sau ở bất kỳ đâu:
thì nó cho phép bạn truy cập phần tử thứ hai của mảng, điều mà bạn thường sử dụng theo cách sau:
Vì vậy, về cơ bản, việc thêm 1 vào 'ptr' sẽ đưa đến địa chỉ của phần tử tiếp theo trong mảng và khi sử dụng *, bạn có thể truy cập giá trị được lưu trữ tại địa chỉ đó. Tương tự như vậy, thêm 2 sẽ đưa bạn đến phần tử thứ ba ... cứ thế tiếp tục.
Đây là một chương trình có thể giúp bạn hiểu rõ hơn về những gì chúng ta vừa thảo luận:
Trước khi bắt đầu với con trỏ và mảng, chúng ta hãy nhanh chóng làm mới lại khái niệm cơ bản về chính con trỏ. Con trỏ là một loại biến đặc biệt có thể chứa địa chỉ. Ví dụ, con trỏ 'ptr' tới một ký tự có thể được khai báo theo cách sau;
Mã:
char *ptr;
Mã:
char c = 'a';
ptr = &c;
Để truy cập hoặc thao tác giá trị của biến được trỏ đến bởi con trỏ, bạn có thể sử dụng toán tử *. Ví dụ, để thay đổi giá trị của biến c từ 'a' thành 'b', bạn có thể sử dụng con trỏ 'ptr' theo cách sau:
Mã:
*ptr = 'b';
Mã:
#include
int main()
{
char c = 'a';
char *ptr = &c;
*ptr = 'b';
printf ("biến c = %c", c);
return 0;
}
Mã:
biến c = b
Con trỏ và Mảng
Như bạn sẽ dành nhiều thời gian hơn để viết và đọc mã C, bạn sẽ thấy rằng con trỏ và mảng thường được sử dụng cùng nhau. Ví dụ, bạn có thể truy cập các phần tử riêng lẻ của một mảng bằng con trỏ. Hãy xem xét đoạn mã sau:
Mã:
...
...
...
char arr[] = {'a','b','c','d','e'}
char *ptr;
ptr = &arr[0]
...
...
...
Tiếp theo, khi bạn có một con trỏ trỏ đến phần tử đầu tiên của một mảng, bạn cũng có thể dễ dàng truy cập các phần tử khác của mảng. Ví dụ, nếu - trong ngữ cảnh của đoạn trích mã ở trên - bạn sử dụng biểu thức sau ở bất kỳ đâu:
Mã:
*(ptr+1)
Mã:
arr[1]
Đây là một chương trình có thể giúp bạn hiểu rõ hơn về những gì chúng ta vừa thảo luận:
Mã:
#include
int main()
{
char arr[] = {'a','b','c','d','e'};
char *ptr = &arr[0];
for(int i=0;i