2017-12-12 13 views
1

*p+=1作品ではなく、何らかの理由で指摘して*p++がない私は、再帰運動を行なったし、値に1を追加する必要があり、私は彼らの*p++または*p+=1.ポインタ算術

両方を行っているとの違いは何であるか理解できませんでした。ポインタp、次いで1によって間接参照値をインクリメント間接参照

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

[逆参照ポインタのポストインクリメント?](https://stackoverflow.com/questions/859770/post-increment-on-a-dereferenced-pointer) –

答えて

1

*p += 1;手段。 *p++;

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

を意味しますが、コンパイラが*(p++);としてそれを解析しますので++*演算子よりも優先順位が高いためです。

(*p)++は、*p += 1;に相当します。

+0

と '* p + = 1' '(* p)+ = 1'を意味します。 – goodvibration

1

優先順位は賢明

++ > * > += 

ここ*p+=1pによって指される値が増加しています。ここでは、pが指し示すメモリ位置の値がインクリメントされます。コードの変化を見ることができます。

第2のケースでは、*p++はポインタpを増やしていますが、その値を参照解除しますが、そのr値はどこにも割り当てません。これは、メモリにあるpが指す実際のコンテンツを変更していません。

そのため、2番目のケースでは、作業変数に変更が見られず、動作しないと確信しています。確かにそうではありません。