2017-03-09 5 views
-4

int * r = * qを理解できません。そして(* R)++;(?ここで、rはアナロジーを形成する方法、=記号の後LHSの整数を指すポインタである)説明* r = * q

#include <iostream> 
using namespace std; 
int main() 
{ 
    int a=100; 
    int *p=&a; 
    int **q=&p; 
    int b=(**q)++; 
    int *r=*q; 
    ++(*r); 


    cout<<a<<" "<<b<<endl; 
    getchar(); 
} 
+0

デバッガでコードをステップ実行し、各行の変数を調べます。 –

+0

'int * r =&a;と実質的に同じ' int * r = p; 'と実質的に同じです。' – WhozCraig

+0

'* r = * q'は' a'へのポインタに 'r'を初期化し、 '++(* r);' deference 'r'を実行して値をインクリメントするので、' a'は '101'になります。 – George

答えて

4

我々が定義した後、ややグラフィカルにそれをレイアウトした場合そしてqの初期化は、それはターンポイントでaからpqポイントであるこの

 
+---+  +---+  +---+ 
| q | --> | p | --> | a | 
+---+  +---+  +---+ 

ようになります。

qを逆参照すると、pとなります。

のでrの初期化が

int *r = p; 

すなわち同等です上のグラフは、今r(またはp)を参照解除

 
+---+  +---+  +---+ 
| q | --> | p | --/-> | a | 
+---+  +---+ | +---+ 
       | 
      +---+ | 
      | r | -/ 
      +---+ 

のように見えるあなたの変数aし、その値を与えます。そう、例えば。 ++(*r)は、++(*p)と同じで、++(a)と同じです。

0

他の回答まで追加するには:あなたがC++を使用しているので、あなたはint* r代わりのint *rと「リンク」、左側にintの代わりに、rにスターとしてポインタ型を書きたいかもしれません。

一方、新しい変数を宣言しない場合、*は逆参照を意味するため、*qqが指し示す値にアクセスします。

0
int main() 
{ 
    int a=100; 
    int *p=&a; 
    // p -> a = 100 

    int **q=&p; 
    // q -> p -> = 100 

    int b=(**q)++; 
    // b equals q dereferenced twice, then incremented. So b = a++ = 101 


    int *r=*q; 
    // *r equals q dereferenced once. So *r = p 

    ++(*r); 
    // r is dereferenced. So *r = *p = a = 100 
}