Verwirrt durch die einzelnen Zeiger und Doppel-pointer-Argumente in Funktionsaufrufen

Ich versuche, ein tieferes Verständnis über pointer-Argumente in Funktionen für C. ich geschrieben habe ein test-Programm, um zu versuchen, um den Unterschied zu sehen zwischen der Weitergabe einer einzigen Zeiger vs double Zeiger auf eine Funktion, und dann zu modifizieren.

Ich habe ein Programm, das zwei Funktionen hat. Die erste Funktion modifyMe1 mit einem einzigen Zeiger als argument und ändert eine Eigenschaft zum 7. Die zweite Funktion modifyMe2 nimmt einen double-pointer als argument und ändert eine Eigenschaft zum 7.

Ich erwartet, dass die erste Funktion modifyMe1 wäre: "pass-by-value", das ist, wenn ich ging in mein struct-pointer, C schaffen würde, eine Kopie der Daten zeigte es. Während bei den letzteren, ich bin dabei ein "pass-by-reference", das sollte ändern Sie die Struktur an Ort und Stelle.

Jedoch, wenn ich testen Sie dieses Programm aus, beide Funktionen scheinen zu ändern, die Struktur im Ort. Ich weiß, es ist ein Missverständnis für mich auf die Art der Zeiger-Argumente für sicher. Kann mir jemand helfen, deaktivieren Sie dies für mich?

Dank!

Hier ist was ich habe:

#include <stdio.h>
#include <stdlib.h>

struct myStructure {
    int a;
    int b;
};

void modifyMe1(struct myStructure *param1) {
    param1->a = 7;
}

void modifyMe2(struct myStructure **param1) {
    (*param1)->a = 7;
}

int main(int argc, char *argv[]) {
    struct myStructure *test1;

    test1 = malloc(sizeof(test1));
    test1->a = 5;
    test1->b = 6;

    modifyMe1(test1);

    printf("a: %d, b: %d\n", test1->a, test1->b);

    //set it back to 5
    test1->a = 5;
    printf("reset. a: %d, b: %d\n", test1->a, test1->b);

    modifyMe2(&test1);

    printf("a: %d, b: %d\n", test1->a, test1->b);


    free(test1);
    return 0;
}

In dem meine Ausgabe ist:

$ ./a
a: 7, b: 6
reset. a: 5, b: 6
a: 7, b: 6
  • Sie können immer ändern, was ein Zeiger verweist. Jedoch, wie alle Dinge in C als Wert übergeben werden (Kopie), Sie können nicht ändern, die Funktion-argument, so dass der Anrufer sehen kann das ändern, es sei denn, Sie fügen Sie eine Ebene der Dereferenzierung. d.h., dieser code ändert nur die lokale Kopie; void foo(int *p) { p = malloc(size); }.
  • wenn Zeiger verwenden, dann übergeben, indem Zeiger, nicht nach Wert. Wenn die doppelten Zeiger, übergeben Sie die Adresse des Zeigers. Wenn Sie wollen, um pass " - Wert übergeben, ohne jegliche Hinweise.
  • Ich meine nicht zu pedantisch sein, aber diese Frage scheint zu verwirren, alle Anfänger, alles, was in C durch Wert übergeben wird. Enthält Zeiger als gut.
  • Ja, das ist verwirrend, denn wenn Sie an Wert von etwas, das nicht ist ein Zeiger heißt es pass-by-value, und geben Sie den Wert des Zeigers, dies wird als pass-by-Zeiger.
  • Ich habe noch nie den Begriff "pass-by-pointer". Ich denke, es ist mehr einfach nur verstehen, dass, in C, alles von Wert übergeben wird. Zeiger sind nichts besonderes in keiner Weise.
  • Hi Ed, werden Sie sagen, dass mit einer Doppel-Zeiger als argument erlaubt es uns, um die Adresse zu ändern, was er momentan zeigt? Ich denke, ich bin nicht klar, was der "Umweg" bedeutet... :-\
  • Ich habe festgestellt, dass dies Begriffe, die in verschiedenen Büchern. Ich denke, dass es in jeder Sprache, wo-stack verwendet wird alles, was von Wert übergeben wird. Zum Beispiel, in Java gibt es pass-by-value und pass-by-reference beim kopieren der Wert oder die Adresse auf den stack geschoben wird, und diese Terminologie ist weit verbreitet...
  • Es erlaubt Ihnen, zu ändern, was die Zeiger pooints, ja. In diesem Fall verweist es auf die ein Zeiger zeigt, so dass Sie ändern können, ist es Wert (also eine Adresse) und der Anrufer sehen die änderung, weil Sie geändert werden, dass der Speicher direkt.
  • Ich bin mir nicht sicher, was es zu tun hat mit dem stack, die eine Implementierung detail, wie die einheimischen gespeichert sind. Die Skillung gar nicht erwähnen, einem "stack", nur variable Lebensdauer. Java hat auch einen stack. C# hat einen Stapel. Das hat nichts damit zu tun, mit dem argument übergeben Semantik
  • javadude.com/articles/passbyvalue.htm

Schreibe einen Kommentar