Home  >  Article  >  Backend Development  >  Which values ​​have pointer semantics?

Which values ​​have pointer semantics?

WBOY
WBOYforward
2024-02-10 21:30:12456browse

Which values ​​have pointer semantics?

php editor Banana will answer a common question for everyone in this article: "Which values ​​have pointer semantics?" In PHP, there are some specific types of values ​​that have pointer semantics. This means they are handled differently in memory than other types of values. Specifically, arrays and objects are values ​​with pointer semantics. When we assign an array or object to another variable, we actually copy the pointer to the original array or object to the new variable. This means that any modifications to the new variable will affect the original array or object. For other types of values, such as integers, floating point numbers, and strings, the assignment operation actually copies the original value to the new variable instead of copying the pointer. Therefore, modifications to the new variable will not affect the original value. This is the concept of values ​​in PHP having pointer semantics.

Question content

In Go, everything is passed by value. Calling a function with a value causes the value to be copied, and the function only accesses a copy of the value.

Pointer semantics allow passing something "by value" to update the "original" value, just as if we were passing a pointer to it.

Which types have pointer semantics?

Solution

If you wish to modify the value passed to the function, all types of variables require the use of pointers.

The only exception is that some reference types can modify their members without passing a pointer, but the type value cannot be modified without using a pointer.

Example of modifying slice members (but not the slice itself) (playground):

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
    }
}

To modify the slice itself (playground):

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

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

However, please note that even in this case, strictly speaking we are not really changing the passed value. In this case, the value passed is a pointer , and the pointer cannot be changed .

The above is the detailed content of Which values ​​have pointer semantics?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete