Maison  >  Article  >  développement back-end  >  Comment déterminer si un pointeur passé en argument de fonction est en cours de modification, ou si la copie est en cours de modification ?

Comment déterminer si un pointeur passé en argument de fonction est en cours de modification, ou si la copie est en cours de modification ?

WBOY
WBOYavant
2024-02-06 10:15:111026parcourir

Comment déterminer si un pointeur passé en argument de fonction est en cours de modification, ou si la copie est en cours de modification ?

Contenu des questions

package main

import (
    "fmt"
)

type Numbers struct {
    x int
    y int
}

func initial(number *Numbers) {
    number.x = 1
    number.y = 1
}

func final(number *Numbers) {
    number = &Numbers{2, 2}
}

func main() {
    p := Numbers{0, 0}
    fmt.Println(p) //Prints {0 0}

    initial(&p)
    fmt.Println(p) //Prints {1 1}

    final(&p)
    fmt.Println(p) //Expected to print {2, 2} but prints {1, 1}
}

Pourquoi initial 函数修改指针,而 final la fonction modifie une copie d'un pointeur ?

initialfinal的函数参数都指向pmain中的内存地址; initial 能够更改 p,而 final je ne peux pas.

Toute explication sur la raison pour laquelle cela se produit serait grandement appréciée.


Bonne réponse


Pour modifier les données pointées par un pointeur, il faut déréférencer le pointeur. L'opérateur de déréférencement est *。然而,为了方便使用,Go 在某些情况下会隐式插入解引用操作。例如,number.x = 1 被转换为 (*number).x = 1.

Cette traduction implicite peut prêter à confusion, mais vous devriez voir que si la traduction ne se produit pas, alors l'expression number.x = 1 将毫无意义,因为 number est de type pointeur et les pointeurs n'ont pas de champs.

En résumé, initial 函数具有隐式指针解引用,而 final ne le fait pas.

Si vous le souhaitez final 更改为显式且正确地取消引用,*number = Numbers{2, 2},那么它也会更改 p.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer