2016-06-21 6 views
0

下の構造体からポインタ 'p'に含まれる値が間違って印刷され、正しく印刷する方法が見つかりません。それにふさわしいコードは何ですか? コード:構造体からポインタの値を出力する方法

#include <stdio.h> 

struct my_struct{ //structure definition 
    int a,*p; 
}; 

int main(){ 

    my_struct var; 
    var.a = 5;     //variable definition 
    var.p = &(var.a);   //pointer gets address from variable 
    printf("%d\n",var.p);  // the number 2686744 is printed instead of the number '5' 

    return 0; 
} 
+4

'* var.p'で参照しない... –

+0

ポインタ自体はちょうどアドレスです。それが指し示す値が必要なので、 '*'演算子、つまり '* var.p 'で逆参照する必要があります。'&(var.a) 'のかっこを削除し、代わりに'&var。これははるかに標準的です。 –

+0

'.'は単項逆参照' * '(_not_ multiply!)より優先順位が高いので、' *(var.p) 'の他の提案のカッコは厳密にオプションであり、優先ルールを覚えるのは面倒ではありません;-)。 Tomのコメントが示すように、 '.'と'& 'は同じことが言えます。 –

答えて

4

%d書式指定子printfには、intを期待していますが、それをint *を渡しています。

printf("%d\n",*(var.p)); 
0

あなたはポインタ(すなわちない値のリテラルアドレスを印刷しているポインタに

my_struct var; 
var.a = 5;     
var.p = &(var.a);   
printf("%d\n",*(var.p)); //this will work  
2

をデリファレンスしていない:あなたはintを得るために、ポインタを間接参照する必要が

それが指している場所のメモリ内のアドレス)を指定すると、printf("%d\n", var.p)と書くことができます。あなたが指している値にアクセスするには、printf("%d\n", *(var.p))でポインタを間接参照する必要があります。サイドノートとして

:あなたは今まで、printf家族の機能に何らかの理由でポインタのアドレスにアクセスする代わりに%p書式指定子を使用したい場合:http://www.cplusplus.com/reference/cstdio/printf/

0

への印刷に使用*のvar.pポインタpを逆参照し、その値を取得します。今は10進数でメモリ位置を表示しています。

+1

'var'はポインタではないので、' - > 'は使用できません。 (私の議決権行使ではない) – DaV

+0

右、私のせい – meJustAndrew

0

あなたのポインタvar.pは、単にアドレスを含むです。私が含むと言うとき、私はそれが値であることを意味しますアドレスです。 あなたの場合、これはvar.aのアドレスです。 を印刷しようとすると、var.aのアドレスが印刷されます。

あなたがが何であるかを印刷したい場合は

はこのアドレスでが含まれ、またはこのアドレスにVALUE何であるか、あなたはそれの前に星を配置する必要があります。

は、あなたのケースでは、このアドレスとして、var.pのを印刷したくないが、あなたは*(var.p)を使用して、値は、このアドレスにを含ん印刷したいです。

一部の言語では、「var.p」と「(var.p)」の間に違いがある場合があります。 数学では、(2x3)²と2x3²の操作を想像してください。 2番目の操作で²が3にしか影響しない場合、最初の操作では²が全体の乗算に影響します。

実際には、 * var.pは別の結果を与えるかもしれません:) しかし、言語が同じ結果を返す場合でも、この場合括弧を使用することは良い方法です。

PS:printfを使用してアドレスを印刷する必要がある場合(現時点では、小数点のみを印刷したい場合)、%dを%pに置き換えてください。

+1

演算子の優先順位に関する追加情報は、ここでは当てはまらないので誤解を招くだけです。 '*(var.p)'は '* var.p'と同じです。なぜなら' .'は '*'より高い優先順位を持つからです。 –

関連する問題