2017-10-28 12 views
8

私は私が画面上に印刷されたそれぞれの値は、次のコードで何を意味するかを理解する必要があるC.に初心者だ:Cポインタの "**&ptr"と "2 ** ptr"の意味は?

#include<stdio.h> 

int main() 
{ 
    int x = 10; 
    int *ptr = &x; 
    printf("%d %d %d\n", *ptr,**&ptr, 2**ptr); 
    return 0; 
} 

出力(GCC):ここで

10 10 20 

私は変数xptrxの変数を指していると宣言しました。したがって、*ptrの印刷値はxです。しかし、私は**&ptr2**ptrの値を理解できませんでした。

ありがとうございます。

+1

最初の10はptrの内容です(そしてptrはxのadrです)ので、xの内容です... 2番目のあなたはptrのadrを取得します、* =あなたは取得しますその内容、* =あなたはまたxであるptrの内容をもう一度得る。最後に* ptrに2を掛け、* ptrにxの内容をもう一度書きます。 –

+2

'* ptr'が何であるか分かっているなら、おそらく' 2 * * ptr'は分かりやすい形式であると理解できます。 – Ryan

+1

これらの読み取り値が有用であることがわかります[ポインタの逆参照とはどういう意味ですか?](https://stackoverflow.com/questions/4955198/what-does-dereferencing-a-pointer -mean)と[参照の意味と参照解除](https://stackoverflow.com/questions/14224831/meaning-of-referencing-and-dereferencing) –

答えて

30

ここで、*&の演算子は、次々と使用されると、互いの効果をキャンセルします。

**&ptrptrx変数のアドレスを保持し、ここ*ptrと同じです。したがって、xの値をここに表示してください。

2**ptrは、2 * (*ptr)と解釈されます。従って、2 * (10)20に等しい。

9
**&ptr 

&*は、他とは反対の意味を持つ1単項演算子です。 *(lvalue)はどのようにそれを間接参照に知るために、左辺値の種類を考慮して、左辺値が指すアドレスから値を返すことを意味している間

&(lvalue)は、対応するlvalueのアドレスを返すことを意味します。しばらくボックスの外側のアドレス私は、ボックス内に正しい値をマークし

 +----------------+    
     | ptr = *&ptr |    
     +--------------+-+    
    /    \ 
    /    \ 
    &ptr     \ 
          +----------------+ 
          | *ptr  | 
          +----------------+ 
         /
         /
         ptr 

注:

視覚的にこれらの演算子の意味は、この(emacsartist-modeで自分の才能が大きすぎるではありません)のように見えます対応するメモリ位置の左の値のメモリの値を格納する。

*&(lvalue)と書くと、すぐに書かれているlvalueのアドレスから値を取得することを意味します。lvalue

だから**&ptr*ptr手段 - 整数として間接参照ptrがアドレスポインタから、すなわち値、あなたのケース10


2**ptr 

にレクサーがトークンのコードとパーサーを分割します結果はあなたのc。で、ptrのアドレスから2倍の値になります。この場合、

(2) * (*ptr) 

:そのようなツリーを構築しますase 20

+5

ニースの回答ですが、正直言って私はあなたのグラフを見つけるかなり混乱しています。 1つは、 'ptr'は2回、1回はボックスの中に、もう一度は1回報告されます。そしてどこにもx = 10はありません。 –

+0

@FabioTuratiボックスの内側は、ボックスの外側にある左側の値の右側の値です。答えは抽象的なものであり、具体的ではないので、x = 10はありません。 – alinsoar

0

ptrはポインタ変数です。このポインタ変数は、xの値が格納されているメモリ位置を指します。* ptrは、ポインタ変数が指す値にアクセスします。

&は、Cのアドレス演算子です。& ptrは、ptrのアドレスを返します。 So * & ptrは、ptrのアドレスから値を返します。 So *と&は互いに無効になります。それはptrであり、* & ptrは同じものです。

ptr = *&ptr => *ptr = **&ptrそこで値は10

2 ** ptrが2 *(* PTR)に過ぎません。したがって、値は20です。

+0

"*' * ptr'はポインタ変数です。* "実際はありません。 'ptr'はポインタである。そして、正しく言及すると、 '* ptr'は逆参照ポインタ' ptr'です。実際、 '* ptr'は' int'を評価します。 – alk

2

int *ptr int xを指します。

printf("%d\n", *ptr);平均値はprtを意味します。したがって* ptrはx値です。

printf("%d\n", **&ptr); - & ptrはポインタのアドレスであり、*&ptrptrの値です。 &ptrの値はxのアドレスです。したがって、**&ptrは、xの値です。

printf("%d\n", 2**ptr); - 2の値をptrで掛けます。それは2 * x

関連する問題