2016-07-21 39 views
3

Während ich C lernte (ich bin sehr neu dazu), spielte ich mit Zeigern herum. Hier können Sie meinen Code sehen:c: bei der Verwendung eines Zeigers als Eingabe in einer Funktion inkrementieren die Zeigern Wert mit * Zeiger ++ funktioniert nicht

#include <stdio.h> 

void change(int *i) 
{ 
    *i += 1; 
} 

int main() 
{ 
    int num = 3; 

    printf("%d\n", num); 
    change(&num); 
    printf("%d\n", num); 

    return 0; 
} 

Mein Ziel für die Num-Wert erhöhen, ohne es zu Neuzuweisung wie so zu ersetzen, war:

num = change(num); 

Deshalb habe ich den Speicherort num vorging die & mit: also könnte es als Zeiger verwendet werden. Vor dieser Version war alles im Code identisch. Das einzige, was anders war, war, dass ich sagte *i++; anstelle von *i += 1;

Nun meine Frage ist, warum kann ich nicht sagen *i++?

+8

Operatorpriorität: Postfixinkrement hat höhere Priorität als unäre Indirektion, hat höhere Priorität als Verbundzuweisung. – EOF

+0

Deutsch zu sein ist keine Entschuldigung für schlechtes Englisch! – Olaf

+0

@Olaf Ich bin Deutscher und habe immer noch Probleme mit dem Englischen. – Michi

Antwort

7

Jetzt ist meine Frage, warum ich * i

Aufgrund Operatorpräzedenz ++ nicht sagen kann, ist *i++ als *(i++) gleich.

*(i++); 

entspricht:

int* temp = i; // Store the old pointer in a temporary variable. 
i++;   // Increment the pointer 
*temp;   // Dereference the old pointer value, effectively a noop. 

Das ist nicht, was Sie wollen. Sie müssen (*i)++ oder ++(*i) verwenden. Diese werden zuerst den Zeiger dereferenzieren und dann den Wert des Objekts, auf das der Zeiger zeigt, inkrementieren.

+0

'* (i ++), was nicht das ist, was Sie wollen' Es wird gut für das OP sein zu wissen, warum. – Michi

+1

@Michi, guter Vorschlag. –

2

Dies ist aufgrund operator precedence.

Sie können sehen, dass "Postfix-Inkrement" auf Rangstufe 1 und "Indirektion (Dereferenzierung)" auf Ebene 2 und Ebene 1 zuerst passiert. Also müssen Sie Klammern verwenden, um die Dereferenzierung zuerst zu erhalten: (*i)++.

Der Unterschied ist (*i)++ sagt Ort der Speicher von i gezeigt, und erhöhen Sie es (was Sie wollen). *(i++) sagt Inkrement i selbst (so zeigt es auf die nächste Speicheradresse), und dereference, dass; Das ist möglicherweise ein No-Op, und nicht das, was Sie wollen.

+0

'Also müssen Sie Klammern verwenden, um die Dereferenzierung zuerst zu erhalten: (* i) ++' Sie könnten dem OP erklären, was passiert, wenn er/sie es nicht tut. – Michi