3

コード:

int a = 5;
int *ptr;
ptr = &a;

printf("%d",*ptr);
printf("\n%d",*(ptr++));
printf("\n%d",(*ptr)++);
printf("\n%d",++(*ptr));

出力:

5
5
1638268
1638268

そして、出力が次のようになることを期待しています。この単純な出力を理解できません。

4

4 に答える 4

6
  1. 最初は明らかに 5 で、ポインターを逆参照するだけです
  2. 後置演算子がポインターのプリインクリメントを返すため、まだ 5 です。
  3. 3 と 4 は、ポインターが割り当てられたメモリを指しなくなったため、ジャンクです。

++2 番目を期待どおりに動作させてジャンクを出力する場合は、代わりにプレフィックスを使用できます

于 2013-08-08T18:33:18.667 に答える
4
int a = 5;
int *ptr;
ptr = &a;

printf("%d",*ptr);          // 5 as you expected.
printf("\n%d",*(ptr++));    // 5, because the pointer is incremented after this line
printf("\n%d",(*ptr)++);    // Not 5 because pointer points to another location.
printf("\n%d",++(*ptr));    // Pointer already changed, no longer pointing at 5.
于 2013-08-08T18:36:29.937 に答える
3
int a = 5;
int *ptr; 
ptr = &a;  // ptr is the address of the int 5

printf("%d",*ptr);  // dereferences ptr, which points to in 5
printf("\n%d",*(ptr++));  // increments ptr by one, so ptr not points to 
                          // an int one over from wherever int 5 is in memory
                          // but return ptr before incrementing and then dereference it
                          // giving int 5
printf("\n%d",(*ptr)++);  // dereference ptr, which is now one int over from 5 thanks
                          // to the last line, which is garbage, try 
                          // to increment garbage by 1 after printing
printf("\n%d",++(*ptr));  // dereference ptr, which is now one int over from 5, 
                          // try to increment garbage by one before printing
于 2013-08-08T18:44:25.220 に答える
3

*ptrの値に他ならない場所の値を与えるだけですa

*(ptr++)と同等で(*ptr)あり(ptr += 1)ポストインクリメントのため、最初に printf で使用される値を提供し、次にポインターをインクリメントして、今は jump memory を指しています。

(*ptr)++(*ptr)はand thenと同等な(*ptr += 1)ので、ジャンク メモリの値を取得してインクリメントします。

++(*ptr)(*ptr) += 1ジャンクの場所で値をインクリメントするの と同等です。これでundefined behavior、最後にインクリメントされた値に 1 を加えた値を取得せず、未定義の動作のために最後の値と同じ値を取得するという効果を確認できます。私のコンパイラでは、最後にインクリメントされた値に 1 を加えた値を取得しました。

于 2013-08-08T18:44:25.630 に答える