2016-03-19 3 views
2

Es gibt eine offensichtliche Diskrepanz in der Art, wie Zeiger verwendet werden, die ich nicht verstehe.Referenzieren/Dereferenzieren in C/C++

Das wird folgender Code aus Pointers in C: when to use the ampersand and the asterisk? genommen:

void swap(int *x, int *y) {int tmp = *x; *x = *y; *y = tmp; } 
... 
int a = 1, b = 2; 
printf("before swap: a = %d, b = %d\n", a, b); 
swap(&a, &b); 
printf("after swap: a = %d, b = %d\n", a, b); 

Der folgenden Code aus https://en.wikipedia.org/wiki/Typedef genommen wird:

int do_math(float arg1, int arg2) { 
    return arg2; 
} 

int call_a_func(int (*call_this)(float, int)) { 
    int output = call_this(5.5, 7); 
    return output; 
} 

int final_result = call_a_func(&do_math); 

was hier verstehe ich nicht:

Im ersten Fall Um dem Effekt des referenzierenden Operators entgegenzuwirken, wird der Dereferenzierungsoperator mit x undverwendet, damit Sie sie mehr oder weniger auf die gleiche Weise verwenden können, wie Sie sie ohne Dereferenzierung verwenden würden, wenn Sie sie nicht per Referenz übergeben hätten, verwenden Sie sie mit *. Aber im zweiten Fall wird call_this nicht mit einem Dereferenzierungsoperator aufgerufen, der der Tatsache entgegenwirkt, dass er per Referenz übergeben wurde. d.h. es heißt nicht (*call_this)(5.5, 7).

Warum würden Sie * verwenden, um den Effekt der Weitergabe durch Verweis entgegenzuwirken, so dass Sie die Sache mehr oder weniger verwenden können, wie Sie normalerweise im Falle von Variablen, aber nicht im Falle von Funktionen tun würden?

+1

C Referenzen nicht unterstützt, nur Zeiger. C++ ist eine andere Sprache. Und ein "referenzierender Operator" existiert in C nicht. – Olaf

+1

Ich finde die Verwendung des Ausdrucks "Gegensteuern" sehr verwirrend. Hier gibt es kein Gegensteuern. Ich würde empfehlen, dass Sie sich die Bücher auf [dieser Liste] (http://stackoverflow.com/q/388242/2069064) ansehen und sie durchlesen, um besser zu verstehen, was Zeiger sind. – Barry

+0

Ich denke, mein Gebrauch des Wortes Gegengewicht war ein wenig verwirrend. Ich meinte nur, wenn du einen Wert als Referenz übertriffst, musst du ihn dereferenzieren, um ihn normal zu verwenden, also ergänzen sich die beiden. – inhahe

Antwort

2

Sie können Funktionszeiger sowie Funktionen aufrufen:

void (*a)(); 
void (b)(); 

// Both valid 
a(); 
b(); 
+0

danke, bedeutet das, dass '(* call_this) (5.5, 7)' im obigen Code genauso gut funktioniert hätte? – inhahe

+0

@inhahe: Ja, tut es – Dani