Heim  >  Artikel  >  Backend-Entwicklung  >  Welche Werte haben Zeigersemantik?

Welche Werte haben Zeigersemantik?

WBOY
WBOYnach vorne
2024-02-10 21:30:12457Durchsuche

Welche Werte haben Zeigersemantik?

Der PHP-Editor Banana beantwortet in diesem Artikel eine häufig gestellte Frage: „Welche Werte haben eine Zeigersemantik?“ In PHP gibt es einige bestimmte Arten von Werten, die eine Zeigersemantik haben, was bedeutet, dass sie es sind im Speicher. Wird anders behandelt als andere Arten von Werten. Insbesondere sind Arrays und Objekte Werte mit Zeigersemantik. Wenn wir einer anderen Variablen ein Array oder Objekt zuweisen, kopieren wir tatsächlich den Zeiger auf das ursprüngliche Array oder Objekt in die neue Variable. Das bedeutet, dass sich alle Änderungen an der neuen Variablen auf das ursprüngliche Array oder Objekt auswirken. Bei anderen Werttypen wie Ganzzahlen, Gleitkommazahlen und Zeichenfolgen kopiert die Zuweisungsoperation tatsächlich den ursprünglichen Wert in die neue Variable, anstatt den Zeiger zu kopieren. Daher haben Änderungen an der neuen Variablen keinen Einfluss auf den ursprünglichen Wert. Dies ist das Konzept von Werten mit Zeigersemantik in PHP.

Frageninhalt

In Go wird alles als Wert übergeben. Der Aufruf einer Funktion mit einem Wert führt dazu, dass der Wert kopiert wird und die Funktion nur auf eine Kopie des Werts zugreift.

Zeigersemantik ermöglicht die Übergabe von etwas „als Wert“, um den „ursprünglichen“ Wert zu aktualisieren, genau so, als würden wir einen Zeiger darauf übergeben.

Welche Typen haben Zeigersemantik?

Problemumgehung

Wenn Sie den an die Funktion übergebenen Wert ändern möchten, erfordern alle Arten von Variablen die Verwendung von Zeigern.

Die einzige Ausnahme besteht darin, dass einige Referenztypen ihre Mitglieder ändern können, ohne einen Zeiger zu übergeben, der Typwert jedoch nicht ohne die Verwendung eines Zeigers geändert werden kann.

Beispiel (Spielplatz) zum Ändern von Slice-Mitgliedern (aber nicht des Slice selbst):

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

So ändern Sie das Slice selbst (Spielplatz):

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

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

Bitte beachten Sie jedoch, dass wir den übergebenen Wert auch in diesem Fall streng genommen nicht wirklich ändern. In diesem Fall ist der übergebene Wert ein Zeiger , und dieser Zeiger kann nicht geändert werden .

Das obige ist der detaillierte Inhalt vonWelche Werte haben Zeigersemantik?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen