Đi - Con trỏ

Con trỏ trong cờ vây rất dễ học và thú vị. Một số tác vụ lập trình cờ vây được thực hiện dễ dàng hơn với con trỏ và các tác vụ khác, chẳng hạn như gọi bằng tham chiếu, không thể thực hiện nếu không sử dụng con trỏ. Vì vậy, nó trở nên cần thiết để học các mẹo để trở thành một lập trình viên cờ vây hoàn hảo.

Như bạn đã biết, mọi biến là một vị trí bộ nhớ và mọi vị trí bộ nhớ đều có địa chỉ của nó được xác định có thể được truy cập bằng toán tử dấu và (&), biểu thị một địa chỉ trong bộ nhớ. Hãy xem xét ví dụ sau, sẽ in ra địa chỉ của các biến được xác định:

package main

import "fmt"

func main() {
   var a int = 10   
   fmt.Printf("Address of a variable: %x\n", &a  )
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Address of a variable: 10328000

Như vậy bạn đã hiểu địa chỉ bộ nhớ là gì và cách truy cập nó. Bây giờ chúng ta hãy xem các con trỏ là gì.

Con trỏ là gì?

A pointerlà một biến có giá trị là địa chỉ của một biến khác, tức là địa chỉ trực tiếp của vị trí bộ nhớ. Giống như bất kỳ biến hoặc hằng số nào, bạn phải khai báo một con trỏ trước khi có thể sử dụng nó để lưu trữ bất kỳ địa chỉ biến nào. Dạng chung của khai báo biến con trỏ là:

var var_name *var-type

Đây, typelà kiểu cơ sở của con trỏ; nó phải là kiểu dữ liệu C hợp lệ vàvar-namelà tên của biến con trỏ. Dấu hoa thị * mà bạn sử dụng để khai báo một con trỏ giống với dấu hoa thị mà bạn sử dụng cho phép nhân. Tuy nhiên, trong câu lệnh này, dấu hoa thị được sử dụng để chỉ định một biến làm con trỏ. Sau đây là khai báo con trỏ hợp lệ:

var ip *int        /* pointer to an integer */
var fp *float32    /* pointer to a float */

Kiểu dữ liệu thực tế của giá trị của tất cả các con trỏ, dù là số nguyên, số thực hay cách khác, đều giống nhau, một số thập lục phân dài đại diện cho một địa chỉ bộ nhớ. Sự khác biệt duy nhất giữa các con trỏ của các kiểu dữ liệu khác nhau là kiểu dữ liệu của biến hoặc hằng số mà con trỏ trỏ tới.

Làm thế nào để sử dụng con trỏ?

Có một số thao tác quan trọng mà chúng tôi thường thực hiện với con trỏ: (a) chúng tôi xác định biến con trỏ, (b) gán địa chỉ của một biến cho con trỏ và (c) truy cập giá trị tại địa chỉ được lưu trữ trong biến con trỏ .

Tất cả các hoạt động này được thực hiện bằng cách sử dụng toán tử một ngôi * trả về giá trị của biến nằm tại địa chỉ được chỉ định bởi toán hạng của nó. Ví dụ sau minh họa cách thực hiện các thao tác này:

package main

import "fmt"

func main() {
   var a int = 20   /* actual variable declaration */
   var ip *int      /* pointer variable declaration */

   ip = &a  /* store address of a in pointer variable*/

   fmt.Printf("Address of a variable: %x\n", &a  )

   /* address stored in pointer variable */
   fmt.Printf("Address stored in ip variable: %x\n", ip )

   /* access the value using the pointer */
   fmt.Printf("Value of *ip variable: %d\n", *ip )
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20

Nil Pointers in Go

Trình biên dịch Go gán một giá trị Nil cho một biến con trỏ trong trường hợp bạn không có địa chỉ chính xác để được gán. Điều này được thực hiện tại thời điểm khai báo biến. Một con trỏ được gán nil được gọi lànil con trỏ.

Con trỏ nil là một hằng số có giá trị bằng 0 được xác định trong một số thư viện chuẩn. Hãy xem xét chương trình sau:

package main

import "fmt"

func main() {
   var  ptr *int

   fmt.Printf("The value of ptr is : %x\n", ptr  )
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

The value of ptr is 0

Trên hầu hết các hệ điều hành, các chương trình không được phép truy cập bộ nhớ ở địa chỉ 0 vì bộ nhớ đó được hệ điều hành dành riêng. Tuy nhiên, địa chỉ bộ nhớ 0 có ý nghĩa đặc biệt; nó báo hiệu rằng con trỏ không nhằm mục đích trỏ đến vị trí bộ nhớ có thể truy cập được. Nhưng theo quy ước, nếu một con trỏ chứa giá trị nil (không), nó được coi là không trỏ đến.

Để kiểm tra con trỏ nil, bạn có thể sử dụng câu lệnh if như sau:

if(ptr != nil)     /* succeeds if p is not nil */
if(ptr == nil)    /* succeeds if p is null */

Xem chi tiết con trỏ

Con trỏ có nhiều khái niệm nhưng dễ và chúng rất quan trọng đối với lập trình cờ vây. Các khái niệm sau về con trỏ phải rõ ràng đối với một lập trình viên cờ vây:

Sr.No Khái niệm & Mô tả
1 Go - Mảng con trỏ

Bạn có thể xác định mảng để chứa một số con trỏ.

2 Đi - Con trỏ tới con trỏ

Go cho phép bạn có con trỏ trên một con trỏ, v.v.

3 Chuyển con trỏ đến các hàm trong Go

Truyền một đối số theo tham chiếu hoặc theo địa chỉ đều cho phép đối số đã truyền được thay đổi trong hàm gọi bởi hàm được gọi.