2017-09-02 4 views
1

Ich komme aus einer dominant objektorientierten Programmiersprache und versuche die Funktionsweise von C ein wenig mehr zu verstehen, entschied mich dafür ein kleines Programm zu machen.C - als Referenz übergeben?

Das Problem, das ich habe, ist, was in der Regel mit der Verwendung von DI angesprochen wird, wie übergebe ich die Referenz eines Wertes an eine andere Funktion, so dass es arithmetische Berechnungen durchführen kann, ohne globale Variablen zu verwenden?

Betrachten Sie das folgende Programm:

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

int doStuff(int v) 
{ 
    v = v + 10; // main->value = 10 
} 

int otherStuff(int v) 
{ 
    v = v - 10; // main->value = 0 
} 

int main() 
{ 
    int value = 0; 
    int stop = 0; 

    do 
    { 
     printf(" %i should be 0 \n", value); 

     doStuff(value); // "value" = 10 
     printf(" %i should be 10 \n", value); 

     otherStuff(value); // "value" = 0 
     printf(" %i should be 0 \n", value); 

     exit(0); 

     if(value >= 10) 
     { 
      stop = 1; 
     } 

    } while(!stop); 

} 

Ausgang:

0 should be 0 
0 should be 10 
0 should be 0 

Antwort

1

sie als Zeiger übergeben. Wenn Sie den Wert nicht zurückgeben - deklarieren Funktionen ungültig oder zurückgeben etwas

void doStuff(int *v) 
{ 
    *v = *v + 10; // main->value = 10 
} 

void otherStuff(int *v) 
{ 
    *v = *v - 10; // main->value = 0 
} 

und in der Haupt

 doStuff(&value); // "value" = 10 
/*....*/ 
     otherStuff(&value); // "value" = 0 

int * v in der Funktion bedeutet, dass v der Zeiger auf das int-Objekt ist. im Funktionsaufruf & Wert übergibt den Zeiger (Adresse) an den Wert. Dereferenzieren des Zeigers v in der Funktion - alle Auswertungen werden auf den Wert angewendet.

+0

Dies schien den Trick zu tun. Stört es mich, zu fragen, was das & tatsächlich anders macht? –

+0

@JaheeKaje übergeben Sie den Zeiger auf den Wert, indem Sie '& value' ausführen, das' & 'gibt den Wert des Zeigers an. Und dann in der Funktion dereferenzieren Sie den Zeiger, so dass Sie den tatsächlichen Wert ändern können – tgdn

2

einen Blick auf diese: Passing by reference in C

In Ihrem Beispiel Sie den Wert der Variablen sind vorbei, möchten Sie den Wert des Zeigers zu übergeben.

+0

Ich habe in das, aber war nicht genau nach dem Lesen so entschieden, hier zu posten, um meine Verwirrung zu klären.Zum Beispiel, ich bin unsicher, das * und & verwendet, ich weiß nur, dass das * die Zeigeradresse bezeichnet. –

+0

@JaheeKaje Wenn Sie einen Zeiger deklarieren, können Sie sagen, dass * einen Zeiger bezeichnet. Aber es ist auch ein Dereferenzierungsoperator. Um es so einfach wie möglich zu machen, wenn Sie * auf einen Zeiger außerhalb einer Deklaration verwenden, erhält es tatsächlich den Wert, auf den der Zeiger zeigt. –

-1

Sie haben einen Wert aus der Funktion zurück, in Ihrem Fall:

int doStuff(int v) 
{ 
v = v + 10; // main->value = 10 

return v; 

} 

int otherStuff(int v) 
{ 
v = v - 10; // main->value = 0 
return v; 
}  

Und in Haupt müssen Sie den Wert aus der Funktion, wie die Sie value=doStuff(value);

0

zurück speichern Zeiger passieren sollen zu den ganzen Zahlen zu den Funktionen und nicht zu den ganzen Zahlen.

Für Sie arbeiten eine ganze Zahl Zeiger (Referenz), anstatt die ganze Zahl selbst zu akzeptieren, es wie so erklärt werden sollte:

int doStuff(int *v) 

Die * hier zeigt an, dass ein Zeiger auf eine ganze Zahl wird übergeben werden.

Dann in der Funktion selbst müssen wir diese Zeiger auf die ganze Zahl derefernece selbst:

int doStuff(int *v) 
{ 
    // The * here is dereferncing the pointer to the integer it is pointing to 
    *v = *v + 10; // main->value = 10 
} 

Und schließlich sollte die Hauptroutine modifiziert werden, um einen Zeiger auf value anstatt Wert selbst durch die & mit passieren Symbol:

dostuff(&value); 
Verwandte Themen