Which values ​​have pointer semantics?

WBOY
Release: 2024-02-10 21:30:12
forward
463 people have browsed it

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
    }
}
Copy after login

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)
}
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!