Chuỗi các con trỏ trong C
Xin chào các nhà mã hóa tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình đầy thú vị qua thế giới kỳ diệu của chuỗi các con trỏ trong C. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ là người hướng dẫn thân thiện của bạn, và chúng ta sẽ giải quyết chủ đề này từng bước một. Vậy, hãy lấy键盘 (phím ảo) của bạn và cùng nhau lặn vào!
什么是 C 语言中的指针链?
Hãy tưởng tượng bạn đang trong một cuộc săn kho báu, và thay vì một bản đồ, bạn có một loạt các manh mối. Mỗi manh mối chỉ đến manh mối tiếp theo, tạo thành một chuỗi dẫn đến kho báu. Đó chính là bản chất của chuỗi các con trỏ trong C!
Trong lập trình C, một chuỗi các con trỏ là một序列 các con trỏ trong đó mỗi con trỏ chỉ đến một con trỏ khác, ngoại trừ con trỏ cuối cùng, thường chỉ đến một biến của một kiểu dữ liệu cụ thể.
Hãy bắt đầu với một ví dụ đơn giản:
int value = 42;
int *ptr1 = &value;
int **ptr2 = &ptr1;
int ***ptr3 = &ptr2;
Trong đoạn mã này:
-
value
là kho báu của chúng ta (một số nguyên với giá trị 42). -
ptr1
là một con trỏ giữ địa chỉ củavalue
. -
ptr2
là một con trỏ đến con trỏ (chú ý đến dấu hai chấm than) giữ địa chỉ củaptr1
. -
ptr3
là một con trỏ đến con trỏ đến con trỏ (dấu chấm than ba!) giữ địa chỉ củaptr2
.
Đó như một bộ dolls Nga! ?
Làm thế nào để thực hiện việc truy cập?
Bây giờ, hãy nói về việc truy cập. Truy cập là như mở từng dolls để đến doll bên trong. Trong chuỗi con trỏ của chúng ta, chúng ta sử dụng dấu chấm than (*
) để truy cập.
printf("Giá trị: %d\n", ***ptr3);
Dòng này có thể trông有点吓人 với ba dấu chấm than, nhưng hãy phân tích nó:
-
*ptr3
cho chúng ta địa chỉ lưu trữ trongptr2
-
**ptr3
(hoặc*(*ptr3)
) cho chúng ta địa chỉ lưu trữ trongptr1
-
***ptr3
(hoặc*(*(*ptr3))
) cuối cùng cho chúng ta giá trị củavalue
, đó là 42
Đó như nói, "Mở doll lớn, sau đó mở doll trung bình bên trong nó, sau đó mở doll nhỏ bên trong đó để tìm kho báu!"
Chuỗi các con trỏ浮点数
Hãy thử điều này với các số dấu phẩy động:
float pi = 3.14159;
float *fPtr1 = π
float **fPtr2 = &fPtr1;
float ***fPtr3 = &fPtr2;
printf("Giá trị của pi: %f\n", ***fPtr3);
Điều này hoạt động như ví dụ số nguyên của chúng ta, nhưng với các số dấu phẩy động. Khi chúng ta in ***fPtr3
, chúng ta đang theo dõi chuỗi các con trỏ trở lại đến giá trị pi
.
Cập nhật biến gốc bằng cách truy cập
Một trong những điều thú vị về chuỗi các con trỏ là chúng ta có thể sử dụng chúng để thay đổi giá trị gốc. Hãy xem cách nó hoạt động:
int score = 85;
int *scorePtr1 = &score;
int **scorePtr2 = &scorePtr1;
printf("Điểm ban đầu: %d\n", score);
**scorePtr2 = 90; // Cập nhật giá trị thông qua chuỗi con trỏ
printf("Điểm đã cập nhật: %d\n", score);
Trong ví dụ này, chúng ta sử dụng **scorePtr2
để thay đổi giá trị của score
. Đó như gửi một thông điệp qua một chuỗi người để cập nhật bảng điểm!
Chuỗi các con trỏ ký tự
Hãy kết thúc với một ví dụ稍微 phức tạp hơn sử dụng các con trỏ ký tự:
char letter = 'A';
char *charPtr1 = &letter;
char **charPtr2 = &charPtr1;
char ***charPtr3 = &charPtr2;
printf("Ký tự ban đầu: %c\n", ***charPtr3);
**charPtr2 = 'B'; // Cập nhật giá trị
printf("Ký tự đã cập nhật: %c\n", letter);
Điều này hoạt động theo cùng một cách như các ví dụ trước của chúng ta, nhưng với các ký tự. Chúng ta có thể thay đổi ký tự từ 'A' thành 'B' sử dụng chuỗi các con trỏ.
Bảng tóm tắt phương pháp
Dưới đây là bảng tóm tắt các phương pháp chúng ta đã thảo luận:
Phương pháp | Mô tả | Ví dụ |
---|---|---|
Tạo một con trỏ | Sử dụng toán tử & để lấy địa chỉ của một biến |
int *ptr = &value; |
Truy cập | Sử dụng toán tử * để truy cập giá trị mà con trỏ chỉ đến |
int x = *ptr; |
Tạo một con trỏ đến con trỏ | Sử dụng hai chấm than **
|
int **ptr2 = &ptr1; |
Truy cập chuỗi | Sử dụng nhiều chấm than | int value = ***ptr3; |
Cập nhật qua chuỗi | Gán một giá trị sử dụng con trỏ đã truy cập | **ptr2 = 90; |
Và đó là tất cả, các bạn! Chúng ta đã đi qua con đường uốn lượn của chuỗi các con trỏ trong C. Nhớ rằng, thực hành là chìa khóa của thành công, vì vậy đừng ngại thử nghiệm với các khái niệm này. Trước khi bạn biết điều đó, bạn sẽ dễ dàng điều khiển các con trỏ như một nghệ sĩ xiếc chuyên nghiệp! ?
Chúc các bạn lập trình vui vẻ, và mong các con trỏ của bạn luôn chỉ đúng hướng! ?
Credits: Image by storyset