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 - Chain of Pointers

什么是 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ủa value.
  • ptr2 là một con trỏ đến con trỏ (chú ý đến dấu hai chấm than) giữ địa chỉ của ptr1.
  • ptr3 là một con trỏ đến con trỏ đến con trỏ (dấu chấm than ba!) giữ địa chỉ của ptr2.

Đó 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ó:

  1. *ptr3 cho chúng ta địa chỉ lưu trữ trong ptr2
  2. **ptr3 (hoặc *(*ptr3)) cho chúng ta địa chỉ lưu trữ trong ptr1
  3. ***ptr3 (hoặc *(*(*ptr3))) cuối cùng cho chúng ta giá trị của value, đó 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