2016-11-08 3 views
-1

Ich brauche Hilfe, einige der Ausgaben des Codes unten zu verstehen. (Dies ist nur eine Beispielfrage für eine Zwischenprüfung, keine Hausaufgaben).Bestimmen der Ausgabe mit Zeigern

#include <stdio.h> 
void figure_me_out(int* a, int b, int c, int* d); 

int main(void) { 
    int var1 = 1, var2 = 10, var3 = 15, var4 = 20; 
    figure_me_out(&var1, var2, var3, &var4); 
    printf("%d, %d, %d, %d\n", var1, var2, var3, var4); 
    return 0; 
} 

void figure_me_out(int* a, int b, int c, int* d) { 
    c = b; 
    b = *d; 
    *a = 222; 
    *d = 100; 
    a = d; 
    *a = c; 
} 

Ausgabe

222, 10, 15, 10 

Als ich durch den Code ging ich 10 bekam, 10, 15, 100. Das ist meine Logik war:

c = 10 ---> c war übergeben nach Wert, so ändert sich c nicht für printf
b = 20 ---> gleicher Grund wie oben
* a = 222 ---> das dereferenziert a und gibt ihm den Wert von 222. Da wurde var a übergeben als Referenz verändert es den ursprünglichen Wert.
* d = 100 ---> demselben Grund wie oben

(dieser Teil ist, wo ich verwirrt) a = 100 ---> Ich denke, dass da d auf 100 geändert wurde, dass Mittel a ist zugeordnet, was d ist gleich jetzt, das ist 100.
* a = 10 ---> den Wert von a zu ändern 10

Ich weiß, dass die Funktion nicht die ursprünglichen Werte von b (var2) geändert und c (var3), da sie wertmäßig übergeben wurden, änderte aber den Rest. Also bin ich verwirrt, warum var1 Drucke als 222 und var4 Drucke als 10.

+0

C unterstützt nicht Pass-by-Reference. Es ist streng pass-by-Wert. Zeiger sind keine Referenzen, sie sind erstklassige Typen wie z.B. "int". – Olaf

Antwort

1

Seine einfache bekommt denke ich, lets go Schritt für Schritt:

void figure_me_out(int* a, int b, int c, int* d) 
{ 
c = b; // c = 10 
b = *d; // b = 20 
*a = 222; // *a = 222 : Value at address a is changed to 222 
*d = 100; // *d = 100 : Value at address d is changed to 100 
a = d; // a = d: Change address of local pointer variable a to d. 
*a = c; // Changing value of address a which is same as address d to 10 
} 

In Schritt 3 Sie ursprünglichen Wert bei der Adresse geändert haben, eine, die Sie von Hauptfunktion bestanden haben. In Schritt 5 ändern Sie die übergebene Adresse von der Hauptvariablen zur lokalen Variablen a in Funktion. Nach dem Ausführen von a = d wird die lokale Variable mit der Adresse in die Adresse von d geändert. Jetzt alles, was Sie mit dieser Adresse tun bekommen an der Adresse Standort erfolgt von d In Schritt 6 der Wert von d bis 10.

So endgültige Antwort geändert haben kommt, ist 222, 10, 15, 10

+0

Ihre Erklärungen haben mir sehr geholfen! Das a = d hat mich verwirrt, aber jetzt verstehe ich, also danke für deine Hilfe. – Jasmine

+0

'a = d' ändert den Wert der lokalen Zeigervariablen, nicht ihre Adresse. Bei Variablen kann die Adresse nicht geändert werden. Der Wert eines Zeigers ist die Adresse eines anderen Objekts, * das * ist die geänderte Adresse. (Was wiederum die Adresse eines Objekts nicht ändert, ändert sich dort, wo der Zeiger zeigt) –

0
  1. b und c werden nicht geändert, wie Sie sagen
  2. a von main bei *a = 222
  3. Tricky Teil geändert wird: a = d; bedeutet, dass a jetzt auf die Position d Variable in main() zeigt. Die folgende *a = c setzt 10 auf das Objekt, auf das a zeigt (und früher d). Was bedeutet, dass d es main()10
0

Ich hoffe es kann dir helfen. siehe unten stehendes C-Code-Snippet:

#include <stdio.h> 

void figure_me_out(int* a, int b, int c, int* d); 

int main(void) 
{ 
    int var1 = 1, var2 = 10, var3 = 15, var4 = 20; 
    figure_me_out(&var1, var2, var3, &var4); 
    printf("%d, %d, %d, %d\n", var1, var2, var3, var4); 
    return 0; 
} 

void figure_me_out(int* a, int b, int c, int* d) 
{ 
    c = b;  // Explanation: c is overidden by b, that means 10 so c is 10 now 
    b = *d;  // Explanation: b is 20 
    *a = 222; // Explanation: var1 value modified and it is set 222 (Called by ref.) 
    *d = 100; // Explanation: var4 value modified and it is set 100 (Called by ref.) 
    a = d;  // Explanation: integer pointer a stored address of the var4 
    *a = c;  // Explanation: 10 assigned to var4 (Because c already modified in first line of the this function) 

    //Finally you will get: 222 10 15 10 
}