Wenn eine Funktion den Wert ändert, den ein Zeiger in C darstellt

Lesezeit: 4 Minuten

Benutzer-Avatar
Nick

Ich habe ein main Funktion, die ein Zeichen hat, versuche ich, einen Zeiger darauf zu übergeben char in eine Funktion umwandeln und von ihr ändern lassen A zu B aber es scheint einfach nichts zu ändern. Das hier gezeigte Beispiel ist nur der aktuelle Stand des Codes. Ich habe viele verschiedene Variationen ausprobiert, daher können andere Fehler darin enthalten sein, wenn man einfach an Strohhalmen festhält.

int main()
{
    char result="A";
    setChar(&result);
    printf("%C", result);
}

void setChar(char* charToChange)
{
    charToChange = "B";
}

  • Bitte verwenden Sie nach Möglichkeit die von Markdown bereitgestellten Formatierungsfunktionen, insbesondere für Codefragmente. Der einfachste Weg, dies zu tun, besteht darin, den Code ordentlich in einem externen Editor zu formatieren, ihn zu kopieren und in die Frage einzufügen, den Code auszuwählen und auf zu klicken {} Schaltfläche oben im Bearbeitungsfeld. Dadurch werden am Anfang jeder Zeile vier Leerzeichen eingefügt.

    – RBerteig

    30. Januar 2011 um 20:09 Uhr

  • Durch klareres Denken hätten Sie die Antwort viel schneller selbst finden können. Zeiger “repräsentieren” keine Werte; sie zeigen auf Werte (daher der Name). Sie möchten den Wert zuweisen, auf den der Zeiger zeigt. Sie erhalten den Wert, auf den gezeigt wird, indem Sie den Zeiger dereferenzieren. Sie möchten ein Zeichen zuweisen. Sie geben ein Zeichen mit einfachen Anführungszeichen an.

    – Karl Knechtel

    30. Januar 2011 um 22:51 Uhr

  • Danke, ich verstehe das Konzept gut, es war die Syntax, die das Problem war.

    – Nick

    1. Februar 2011 um 11:14 Uhr

Was Sie wollen, ist *charToChange="b";. Der Zeiger charToChange ist eine lokale Variable (Parameter) in setCharaber Sie können ändern, worauf es zeigt, indem Sie das Präfix verwenden * Operator und eine Zuweisung. Beachten Sie, dass *charToChange ist auch ein Zeichen, kein String.

  • Danke, du glaubst nicht, wie viele Stunden ich mit diesem kleinen * vergeudet habe. Sehr geschätzt.

    – Nick

    30. Januar 2011 um 19:27 Uhr

  • @ Nick Vielleicht möchten Sie einen besseren Compiler kaufen. Die meisten Compiler geben eine Warnung für solche impliziten Typecasts aus.

    – Ludin

    30. Januar 2011 um 20:14 Uhr


Sie müssen Dereferenzierung der Zeiger übergeben an setChar() um den Wert zu ändern, auf den es zeigt, nicht das Zeigerargument selbst.

Sie müssen auch das Zeichenliteral verwenden 'B' anstelle des String-Literals "B" (das ist ein Hinweis auf charkein char).

void setChar(char* charToChange)
{
    *charToChange="B";
}

wenn Sie die Funktion setChar mit aufrufen &Ergebnis als Parameter übergibt es die Adresse des Ergebnisses, wo es gespeichert wird.

also wird es dem char-Zeiger zugewiesen * charToChange

Sagen wir Adresse von Ergebnis ist [0x00000010] -> ‘A’

Und Adresse von charToChange ist [0x00000100] -> 0x00000010

Jetzt, wenn Sie versuchen zu schreiben charToChange = “B”;

Es schafft neue Erinnerungen, wo es speichert “B”

Nehmen wir mal an [0x00001000] -> ‘B’ && [0x00001001] -> ‘\0’

Während der Zuordnung wird es also gespeichert

[0x00000100] -> 0x00001000

Aber doch die Adresse 0x00000010 zeigt auf EIN

Also ist es falsch

Sie sollten ersetzen charToChange = “B”; zu

*charToChange=”B”;

Also dieser Wert bei 0x00000100 Wird zu „B“

Immer daran denken

* Bedeutet ValueAt And

& bedeutet AddressOf

Sie möchten den Wert ändern der Zeiger zeigt aufnicht der Zeiger selbst.

Daher müssen Sie den Zeiger mit dereferenzieren *pointer:

void setChar(char* charToChange) {
    *charToChange="B";
}

Wenn Sie dies nicht tun, ändern Sie einfach den lokalen Wert von charToChange.

Sie müssen es dereferenzieren, und das Literal muss ein Zeichen und kein String sein, dh verwenden Sie Apostrophe anstelle von doppelten Anführungszeichen:

void setChar(char* charToChange)
{
    *charToChange="B";
}

C kopiert Zeiger, die als Parameter an Funktionen übergeben werden. Innerhalb der Funktion manipulieren Sie also eine Kopie des Zeigers, nicht den Zeiger selbst. Wenn die Funktion beendet wird, wird der Zeiger geändert, wenn er wie in geändert wurde

 while (p++)  if (*p = '\0') break;  //example

auf seinen vorherigen Wert zurück und die Kopie wird zerstört. Das Objekt des Speicherorts, auf das der Zeiger zeigt, kann geändert werden, und das ist die ganze Idee dahinter als Referenz übergeben. Ein häufiger Fehler besteht darin, zu versuchen, einen Zeiger innerhalb einer Funktion zu nullen und dann festzustellen, dass er bei der Rückkehr von der Funktion nicht null ist. Auf einigen Systemen erhalten Sie den Zeiger zurück, der auf Müll oder fehlerhafte Speicherorte zeigt, die Ihr Programm zum Absturz bringen, wenn Sie versuchen, aus der Variablen zu lesen oder in sie zu schreiben.

void f(char* s)
{
  /* code stuff */
...
s = NULL;
...
return;
}

bei Rückkehr von f jetzt s = ? (vorheriger Wert , NULL oder GARBAGE ) Dies geschieht am häufigsten bei Variablen, die an Funktionen übergeben werden, die in separaten Modulen definiert sind, die Werte als Referenz annehmen, oder über Ausführungskontexte hinweg (wie Threads oder gemeinsam genutzter Speicher zwischen Prozessen).

Benutzer-Avatar
R242

#include <stdio.h>

void x(char* a){
    *a = *"c";  // here variable a value change into "b"
}
int main()
{
    char a="a";
    x(&a);
    printf("%c\n",a);
    return 0;
}

  • Bitte posten Sie nicht nur Code als Antwort, sondern erklären Sie auch, was Ihr Code tut und wie er das Problem der Frage löst. Antworten mit einer Erklärung sind in der Regel hilfreicher und von besserer Qualität.

    – Schwarzbischof

    21. Dezember 2021 um 12:43 Uhr

1353960cookie-checkWenn eine Funktion den Wert ändert, den ein Zeiger in C darstellt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy