Go – Con trỏ

Trong ngôn ngữ lập trình Go, một số bài toán được thực hiện đơn giản hơn khi sử dụng con trỏ, như là gọi bằng tham chiếu sẽ không thể thực hiên được nếu không sử dụng con trỏ.

Như bạn đã biết, một biến là một vị trí bộ nhớ và tất cả vị trí bộ nhớ đều có địa chỉ được định nghĩa và có thể truy cập được bằng cách sử dụng toán tử ký hiệu &, biểu thị một địa chỉ trong bộ nhớ.

Con trỏ là một biến dùng để lưu trữ địa chỉ bộ nhớ của biến khác. Bất cứ khi nào chúng ta cần viết một chương trình đều cần lưu trữ dữ liệu, thông tin vào trong bộ nhớ. Dữ liệu được lưu trong bộ nhớ tại một địa chỉ cụ thể. Địa chỉ bộ nhớ có định dạng như là 0xAFFFF  (dạng hexa). Để truy cập được dữ liệu, chúng ta cần biết địa chỉ nơi nó được lưu trữ. Chúng ta có thể kiểm soát được toàn bộ địa chỉ bộ nhớ nơi dữ liệu của chương trình được lưu trữ

Con trỏ là một dạng biến đặc biệt, bởi vì dữ liệu nó lưu trữ không phải là giá trị thông thường như là integer hoặc string, nó là địa chỉ của biến khác

Trong ví dụ bên trên, con trỏ p chứa giá trị 0x0001, là địa chỉ của biến a

Khai báo con trỏ

Một con trỏ kiểu T được khai báo với cú pháp như sau

Kiểu T là kiểu của biến con trỏ p trỏ đến, ví dụ chúng ta có con trỏ kiểu int như sau

Con trỏ bên trên có thể chỉ lưu trữ địa chỉ bộ nhớ của các biến int

Giá trị 0 của con trỏ là nil. Nghĩa là bất kỳ con trỏ nào chưa được khởi tạo sẽ có giá trị nil.

Kết quả

Khởi tạo con trỏ

Bạn có thể khởi tạo một con trỏ với địa chỉ bộ nhớ của biến khác. Địa chỉ bộ nhớ của biến có thể nhận được bằng cách sử dụng toán tử &.

Chú ý cách chúng ta sử dụng toán tử & với biến x để lấy được địa chỉ của nó và sau đó gán địa chỉ cho con trỏ p.

Cũng giống như bất kỳ biến nào khác trong Go, kiểu của biến con trỏ p cũng được suy ra bởi trình biên dịch. Nên bạn có thể bỏ qua việc khai báo kiểu cho con trỏ cho ví dụ bên trên và viết lại như sau

Hãy cùng xem ví dụ sau để hiểu rõ hơn

Kết quả

Tham chiếu ngược con trỏ

Bạn có thể sử dụng toán tử * trên con trỏ để truy cập đến giá trị được lưu trữ trong biến con trỏ đang trỏ đến. Nó được gọi là dereferencing (tham chiếu ngược) hoặc indirecting (gián tiếp)

Kết quả

Bạn có thể không chỉ truy cập đến giá trị của biến được trỏ đến sử dụng toán tử *, bạn cũng có thể thay đổi giá trị của nó. Ví dụ sau đây sẽ sửa giá trị được lưu trữ trong biến a thông qua con trỏ p

Kết quả

Tạo con trỏ sử dụng hàm new()

Bạn cũng có thể tạo con trỏ sử dụng hàm tích hợp sẵn new(). Hàm new() nhận kiểu như một tham số, cấp phát đủ bộ nhớ để chứa giá trị của kiểu, và trả về một con trỏ cho nó.

Kết quả

Con trỏ cho con trỏ

Một con trỏ có thể trỏ đến biến với kiểu bất kỳ. Nó cũng có thể trỏ đến con trỏ khác. Ví dụ sau đây biểu diễn cách tạo con trỏ cho con trỏ khác.

Kết quả

Toán học con trỏ không hỗ trợ trong Go

Nếu bạn đã từng làm việc với các ngôn ngữ c\c+, bạn sẽ biết rằng các ngôn ngữ này hỗ trợ toán học con trỏ. Ví dụ bạn có thể tăng hoặc giảm con trỏ để có thể di chuyển lên phía trước hoặc lùi về sau địa chỉ bộ nhớ. Bạn có thể cộng hoặc trừ giá trị cho hoặc từ con trỏ. Bạn cũng có thể so sánh 2 con trỏ bằng cách sử dụng toán tử quan hệ như là ==<>

Nhưng Go không hỗ trợ các phép tính toán học như thế trên con trỏ. Nếu sử dụng phép tính này trên Go thì trình biên dịch sẽ báo lỗi

Tuy nhiên bạn có thể so sánh 2 con trỏ cùng kiểu sử dụng toán tử ==

 

You May Also Like

About the Author: Nguyen Dinh Thuc

Leave a Reply

avatar
  Subscribe  
Notify of