Trong hướng dẫn này, bạn sẽ tìm hiểu về con trỏ; con trỏ là gì, bạn sử dụng chúng như thế nào và những lỗi phổ biến bạn có thể gặp phải khi làm việc với chúng với sự trợ giúp của các ví dụ.
Con trỏ là tính năng mạnh mẽ của lập trình C và C ++. Trước khi tìm hiểu con trỏ, chúng ta hãy tìm hiểu về địa chỉ trong lập trình C.
Địa chỉ ở C
Nếu bạn có một biến var trong chương trình của mình, &var
nó sẽ cung cấp cho bạn địa chỉ của nó trong bộ nhớ.
Chúng tôi đã sử dụng địa chỉ nhiều lần trong khi sử dụng scanf()
hàm.
scanf("%d", &var);
Ở đây, giá trị do người dùng nhập vào được lưu trong địa chỉ của biến var. Hãy lấy một ví dụ làm việc.
#include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; )
Đầu ra
var: 5 địa chỉ của var: 2686778
Lưu ý: Bạn có thể sẽ nhận được một địa chỉ khác khi chạy đoạn mã trên.
Con trỏ C
Con trỏ (biến con trỏ) là các biến đặc biệt được sử dụng để lưu trữ địa chỉ hơn là giá trị.
Cú pháp con trỏ
Đây là cách chúng ta có thể khai báo con trỏ.
int* p;
Ở đây, chúng ta đã khai báo một con trỏ p int
kiểu.
Bạn cũng có thể khai báo con trỏ theo những cách này.
int *p1; int * p2;
Hãy lấy một ví dụ khác về khai báo con trỏ.
int* p1, p2;
Ở đây, chúng ta đã khai báo một con trỏ p1 và một biến bình thường p2.
Gán địa chỉ cho Con trỏ
Hãy lấy một ví dụ.
int* pc, c; c = 5; pc = &c;
Ở đây, 5 được gán cho biến c. Và, địa chỉ của c được gán cho con trỏ pc.
Nhận giá trị của điều do con trỏ chỉ ra
Để nhận giá trị của thứ được trỏ bởi các con trỏ, chúng ta sử dụng *
toán tử. Ví dụ:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5
Ở đây, địa chỉ của c
được gán cho con trỏ máy tính. Để lấy giá trị được lưu trong địa chỉ đó, chúng tôi đã sử dụng * pc.
Lưu ý: Trong ví dụ trên, pc là một con trỏ, không phải *pc
. Bạn không thể và không nên làm điều gì đó như *pc = &c
;
Nhân tiện, *
được gọi là toán tử tham chiếu (khi làm việc với con trỏ). Nó hoạt động trên một con trỏ và cung cấp giá trị được lưu trữ trong con trỏ đó.
Thay đổi giá trị được trỏ bởi con trỏ
Hãy lấy một ví dụ.
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1
Chúng tôi đã gán địa chỉ của c cho con trỏ pc.
Sau đó, chúng tôi thay đổi giá trị của c thành 1. Vì pc và địa chỉ của c giống nhau, *pc
cho chúng tôi 1.
Hãy lấy một ví dụ khác.
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1
Chúng tôi đã gán địa chỉ của c cho con trỏ pc.
Sau đó, chúng tôi thay đổi *pc
thành 1 sử dụng *pc = 1;
. Vì pc và địa chỉ của c giống nhau nên c sẽ bằng 1.
Hãy lấy một ví dụ nữa.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15
Ban đầu, địa chỉ của c được gán cho con trỏ máy tính bằng cách sử dụng pc = &c;
. Vì c là 5, *pc
cho chúng ta 5.
Sau đó, địa chỉ của d được gán cho con trỏ pc bằng cách sử dụng pc = &d;
. Vì d là -15, *pc
cho chúng ta -15.
Ví dụ: Làm việc của con trỏ
Hãy lấy một ví dụ làm việc.
#include int main() ( int* pc, c; c = 22; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 22 pc = &c; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 22 c = 11; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 11 *pc = 2; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 2 return 0; )
Đầu ra
Địa chỉ của c: 2686784 Giá trị của c: 22 Địa chỉ của con trỏ pc: 2686784 Nội dung của con trỏ pc: 22 Địa chỉ của con trỏ pc: 2686784 Nội dung của con trỏ pc: 11 Địa chỉ của c: 2686784 Giá trị của c: 2
Giải thích về chương trình
int* pc, c;
Here, a pointer pc and a normal variable c, both of typeint
, is created.
Since pc and c are not initialized at initially, pointer pc points to either no address or a random address. And, variable c has an address but contains random garbage value.c = 22;
This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.pc = &c;
This assigns the address of variable c to the pointer pc.c = 11;
This assigns 11 to variable c.*pc = 2;
This change the value at the memory location pointed by the pointer pc to 2.
Common mistakes when working with pointers
Suppose, you want pointer pc to point to the address of c. Then,
int c, *pc; // pc is address but c is not pc = c; // Error // &c is address but *pc is not *pc = &c; // Error // both &c and pc are addresses pc = &c; // both c and *pc values *pc = c;
Here's an example of pointer syntax beginners often find confusing.
#include int main() ( int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; )
Why didn't we get an error when using int *p = &c;
?
It's because
int *p = &c;
is equivalent to
int *p: p = &c;
Trong cả hai trường hợp, chúng tôi đang tạo một con trỏ p
(không phải *p
) và gán &c
cho nó.
Để tránh nhầm lẫn này, chúng ta có thể sử dụng câu lệnh như sau:
int* p = &c;
Bây giờ bạn đã biết con trỏ là gì, bạn sẽ tìm hiểu cách con trỏ liên quan đến mảng trong hướng dẫn tiếp theo.