2016-01-07 14 views
6

ポインタを指す値のアドレスをポインタに代入する方法があるかどうかを知りたかったのです。例えば、通常の方法があります:ポインタにアドレスを割り当てる

​​

は私が見るいくつかの場所で、それは次のように宣言:

int *ptr = &a; 

は、これらの方法の両方が同等か?私はいつも* ptrがアドレスではなくの値であるを与えていると考えていたので、ちょっと混乱しています。誰か説明してもらえますか?ありがとう。

+0

両方が同じだけです – kapil

+2

'int * ptr;'を書くときは、ポインタを宣言します。 * ptrを書くときは、値を割り当てます。 *演算子の意味を変更するdéclaration – loginn

+1

'int a = 10、* ptr =&a;' :)と書くこともできます。同じものです –

答えて

9

私は常にアドレスをaの値を与え、そしてないよう*ptr考えられたので、私は少し混乱しています。

*は、ポインタを宣言するために使用され、逆参照演算子としても使用されるため、実際はちょっと混乱しています。 *の実際の意味は、宣言、初期化、または割り当てに使用されているかどうかによって、コンテキストに依存します。

1)宣言、2)初期化、3)割り当ての違いを知ることは価値があります。 1で

int *ptr; // 1) this is declaration without initialisation. 

int *ptr = &a; // 2) this is declaration **and** initialisation (initialise ptr to the address of variable a) 

int b = 10; 
*ptr = b; // 3) this is assignment, assign what pointed by ptr to value of variable b. 
  • *)はptrintへのポインタである(しかし、それはまだ有効な位置を指摘していないことを意味します。
  • 2)*は、ptrintへのポインタであり、その初期値が変数aのアドレスであることを意味します。
  • 3)*は、逆参照演算子です。すなわち、ptrが指すものを変数bの値に代入します。
+0

答えをありがとう!私はそれが今多くのことを理解しています:) – QPTR

2

いいえ、1行で宣言とintiliationです。

これはアイデアがクリアされます。..

typedef int* intp; 

intp ptr=&a; 

同等

intp ptr; //int *ptr; 
ptr=&a; // ptr=&a; 

答えは:YES、彼らは同じです。

あなたは ask-可能性があります - ?どのようにコンパイラが理解しないと(間接または宣言のようである*か)

回答: - Cは、それがされている状況にsensitive..basedコンテキストです使用されたコンパイラがそれを決定します。

+0

ありがとうございました! :) – QPTR

+1

それは大丈夫です... @ QPTR .: – coderredoc

1

int *ptr; ptr = &a;は、int *ptr = &a;であり、int n; n = 3;は、int n = 3;である。

つまり、ポインタの宣言と初期化は通常の変数と変わりありません。可能であれば、初期化されていない変数を持つ危険性がより低いので、私は1行を使用することを好みます。

+0

ありがとう! 1ライナーを使用するのが少し危険だとわかったので、そのアプローチをもっと使用しようとします。 – QPTR

1

宣言時に*演算子が使用されている場合は、宣言されている変数の型を示すために使用されています。他のすべてのケースでは、*演算子が逆参照演算子として使用されます(ただし、乗算演算子として使用される場合を除く)。

だからint *ptr = &aptr&a

を割り当てられ*ptr = aaを割り当てられているvariable stored at address ptrptrをデリファレンス)を意味されているタイプint *の変数であることを意味します。

+0

答えをありがとう! – QPTR

2

これらの方法はどちらも同じですか?

はい。

2番目の方がほんのわずかですが、最後の行までptrが割り当てられません(実際にはコンパイラはおそらくそれを最適化します)。

私はいつも* ptrがアドレスではなく値を与えると考えていたので、少し混乱しています。

変数を宣言する構文を、その変数を使用する構文と混同しています。

int *ptr; 

は、整数へのポインタであるptrという変数を宣言します。

int *ptr = &a; 

は全く同じです。最初の部分は、以前と同じようにポインタの宣言だけです。等号の後の部分は、あなたが宣言した後、後でこの場合には(あなたのaの値をポインタの内容を与える*ptrを指定して、後続のコードで、この変数を使用するときにことを正しいa

のアドレスにptrを初期化する署名します)。

+1

お返事ありがとうございました。それはコンセプトをクリアするのに役立ちました。私は非常に多くの答えを期待していなかったし、すべての答えは、概念を理解するのに役立っているので、あなたの答えを受け入れることができなくなります。しかし、ありがとう! :) – QPTR

+1

問題はありません@ QPTR、私はそれが助けてうれしいです。 – GrahamS