2017-12-12 5 views
1

ich eine Rekursion Übung tat und ich konnte nicht verstehen, was der Unterschied zwischen tun *p++ oder *p+=1. istPointers Arithmetik

Beide sollten 1 in den der Wert bei wies aber aus irgendeinem Grund *p+=1 Werke und *p++ nicht funktioniert .

void rec(char a[], int *p ,int i) 
{ 
    if(a[i+1]== '\0') 
     return; 

    if(a[i]==a[i+1]) 
     *p+=1; 

    rec(a, p, i+1); 
} 


void rec(char a[], int *p ,int i) 
{ 
    if(a[i+1]== '\0') 
     return; 

    if(a[i]==a[i+1]) 
     *p++; 

    rec(a, p, i+1); 
} 
+1

Mögliches Duplikat von [Post-increment auf einem dereferenzierten Zeiger?] (Https://stackoverflow.com/questions/859770/post-increment-on-a-dereferenced-pointer) –

Antwort

1

*p += 1; Mittel, den Zeiger dereferenzieren p und dann durch den 1 dereferenzierte Wert inkrementieren. Während *p++;

*p; 
p += 1; // Increment the pointer itself 

bedeutet ist dies, weil ++ höhere Priorität als * Operator hat so Compiler als *(p++); analysieren wird.

(*p)++ entspricht *p += 1;.

+0

Und '* p + = 1' bedeutet '(* p) + = 1 '. – goodvibration

1

Präzedenz weise

++ > * > += 

Hier *p+=1 erhöht den Wert, der von p gerichtet ist. Hier wird der Wert an der Speicherstelle, auf die zeigt, inkrementiert. Sie können die Änderung in Ihrem Code sehen.

Im zweiten Fall *p++ wird nur der Zeiger p erhöht und dann wird der Wert de-referenziert, aber Sie geben diesen r-Wert nirgends an. Dies ändert nicht den tatsächlichen Inhalt, der sich in dem Speicher befindet, auf den zeigt.

Deshalb sehen Sie im zweiten Fall keine Änderung der Arbeitsvariablen und kamen zu dem Schluss, dass es nicht funktioniert, was sicherlich nicht der Fall ist.