Maison  >  Article  >  développement back-end  >  Quelles valeurs ont une sémantique de pointeur ?

Quelles valeurs ont une sémantique de pointeur ?

WBOY
WBOYavant
2024-02-10 21:30:12457parcourir

Quelles valeurs ont une sémantique de pointeur ?

L'éditeur PHP Banana répondra à une question courante pour vous dans cet article : "Quelles valeurs ont une sémantique de pointeur ?" En PHP, il existe certains types spécifiques de valeurs qui ont une sémantique de pointeur, ce qui signifie qu'elles le sont. en mémoire. Géré différemment des autres types de valeurs. Plus précisément, les tableaux et les objets sont des valeurs avec une sémantique de pointeur. Lorsque nous attribuons un tableau ou un objet à une autre variable, nous copions en fait le pointeur vers le tableau ou l'objet d'origine vers la nouvelle variable. Cela signifie que toute modification apportée à la nouvelle variable affectera le tableau ou l'objet d'origine. Pour d'autres types de valeurs, tels que les entiers, les nombres à virgule flottante et les chaînes, l'opération d'affectation copie en fait la valeur d'origine dans la nouvelle variable au lieu de copier le pointeur. Par conséquent, les modifications apportées à la nouvelle variable n’affecteront pas la valeur d’origine. C'est le concept de valeurs en PHP ayant une sémantique de pointeur.

Contenu des questions

Dans Go, tout est transmis par valeur. L’appel d’une fonction avec une valeur entraîne la copie de la valeur et la fonction accède uniquement à une copie de la valeur.

La sémantique du pointeur permet de passer quelque chose "par valeur" pour mettre à jour la valeur "originale", comme si nous lui passions un pointeur.

Quels types ont une sémantique de pointeur ?

Solution

Si vous souhaitez modifier la valeur passée à la fonction, tous les types de variables nécessitent l'utilisation de pointeurs.

La seule exception est que certains types de référence peuvent modifier leurs membres sans passer de pointeur, mais la valeur du type ne peut pas être modifiée sans utiliser de pointeur.

Exemple (playground) de modification des membres d'une tranche (mais pas de la tranche elle-même) :

func main() {
    s := []int{1, 2, 3, 4}
    modifyslicemember(s)
    fmt.println(s) // [90 2 3 4]
}

func modifyslicemember(s []int) {
    if len(s) > 0 {
        s[0] = 99
    }
}

Pour modifier la tranche elle-même (playground) :

func main() {
    s := []int{1, 2, 3, 4}
    modifySlice(&s)
    fmt.Println(s) // []
}

func modifySlice(s *[]int) {
    *s = make([]int, 0)
}

Cependant, veuillez noter que même dans ce cas, à proprement parler, nous ne modifions pas vraiment la valeur transmise. Dans ce cas, la valeur transmise est un pointeur , et ce pointeur ne peut pas être modifié .

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