Khái Niệm Con Trỏ
Con trỏ là một công cụ hiệu quả giúp tăng hiệu năng của chương trình và thực tế nhiều nhiệm vụ không thể thực hiện được nếu như không sử dụng con trỏ. Trong bài viết này chúng ta sẽ tìm hiểu về con trỏ trong ngôn ngữ lập trình C qua việc làm việc với các ví dụ cụ thể. Con Trỏ Là Gì Con trỏ được ...
Con trỏ là một công cụ hiệu quả giúp tăng hiệu năng của chương trình và thực tế nhiều nhiệm vụ không thể thực hiện được nếu như không sử dụng con trỏ. Trong bài viết này chúng ta sẽ tìm hiểu về con trỏ trong ngôn ngữ lập trình C qua việc làm việc với các ví dụ cụ thể.
Con Trỏ Là Gì
Con trỏ được dùng để trỏ tới tới địa chỉ trên bộ nhớ nơi được dùng để lưu trữ giá trị của biến. Một biến sau khi khai báo nó sẽ có 4 đặc tính như sau:
- Tên biến
- Giá trị hiện tại của biến
- Địa chỉ trên bộ nhớ nơi lưu trữ giá trị của biến
- Kiểu dữ liệu
Trong C khi một biến được khai báo, máy tính sẽ dựa trên kiểu dữ liệu để phân bố một lượng nhất định bộ nhớ để lưu trữ giá trị của biến này. Ví dụ khi bạn khai báo một biễn x như sau:
int x = 45;
Ở trên biến x được định nghĩa với kiểu dữ liệu là integer và máy tính dành ra 4 bytes dung lượng bộ nhớ để lưu giá trị của biến.
Tham Chiếu Tới Địa Chỉ Bộ Nhớ
Để tham chiếu tới địa chỉ bộ nhớ lưu trữ giá trị của biến trong chương trình chúng ta sử dụng toán tử &:
int x = 45; int* y = &x;
Ở trên ngoài việc sử dụng toán tử & thì biến y cũng được khai báo với kiểu dữ liệu int*. Ký tự * ở phía trước nói rằng biến y sẽ là một con trỏ và giá trị của biến này sẽ là một địa chỉ bộ nhớ thay vì giá trị của một biến bình thường.
Giả sử biến x được lưu ở vị trí thứ 928 trên bộ nhớ thì chúng ta sẽ có ảnh sau minh họa tình trạng của bộ nhớ sau khi lưu trữ giá trị các biến như sau:
Bạn để ý ở trên giá trị của biến y là 928 đây cũng là địa chỉ bộ nhớ lưu trữ giá trị của x. Tuy nhiên giá trị của biến x là 44. Ngoài ra giá trị của biến y được lưu trữ sử dụng địa chỉ bộ nhớ từ vị trí thứ 932 tới 935.
Để hiển thị giá trị của địa chỉ bộ nhớ dùng lưu trữ biến x chúng ta sử dụng *y thay vì y:
int x = 45; int *y = &x; printf("Địa chỉ bộ nhớ lưu trữ giá trị biến x là %i", y);
Với giả định là x được lưu bắt đầu ở vị trí thứ 928 thì đoạn mã trên sẽ hiển thị:
Địa chỉ bộ nhớ lưu trữ giá trị biến x là 928
Ở trên nếu bạn sử dụng *y thay vì y như sau:
printf("Địa chỉ bộ nhớ lưu trữ giá trị biến x là %i", *y);
Thì kết quả hiển thị sẽ như sau:
Địa chỉ bộ nhớ lưu trữ giá trị biến x là 45
Lúc này *y được gọi là tham chiếu ngược trở lại hay derefferencing giá trị của con trỏ. Hay nói cách khác máy tính sẽ tìm lại địa chỉ của vùng bộ nhớ dùng để lưu biến mà con trỏ trỏ tới và lấy ra giá trị của biến này.
Thay Đổi Giá Trị Của Biến
Bạn cũng có thể sử dụng con trỏ để thay đổi giá trị của biến. Ví dụ:
int x = 45; int *y = &x; *y = 92; printf("Giá trị của x là: %i", x);
Khi chạy mã lệnh trên bạn sẽ thấy giá trị biến x thay đổi thành 92. Điều này xảy ra vì *y lúc này được sử dụng để tham chiếu tới giá trị của biến x và khi *y thay đổi thì giá trị của x cũng thay đổi.
Tuy nhiên, giá trị của địa chỉ bộ nhớ giá trị của biến x vẫn được giữ nguyên là 928.