2013-01-08 45 views
44

私はインターネット上でさまざまなことを読んで、混乱しました。"参照"と "参照解除"の意味

C.

私はおよそ*参照演算子と&逆参照演算子を読んについて話します。または参照はポインタが変数を指すことを意味し、逆参照はポインタが指す変数の値にアクセスしていることを意味します。だから私は混乱してしまった。

「参照と参照解除」について、簡単ではっきりと説明できますか?

+2

http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=ptrs –

+6

正式名称はアドレス( '&')と間接( '*')演算子。 –

+3

オペレータが混在しています。 *は除外演算子です。 – cheznead

答えて

55

参照は、ポインタ変数を設定するために既存の変数(&を使用)のアドレスを取ることを意味します。 が有効であるためには、ポインタはアスタリスクなしで、ポインタと同じタイプの変数のアドレスに設定されなければならない。

int c1; 
int* p1; 
c1 = 5; 
p1 = &c1; 
//p1 references c1 

を間接参照ポインタは、*演算子(アスタリスクを使用することを意味しますポインタに格納されている値にアクセスするには: 注:ポインタのアドレスに格納されている値は、ポインタが指す変数の型と同じ型の値でなければならないが、保証はないこれは、ポインタが正しく設定されていない場合に当てはまります。ポインタが指す変数の型は、最も外側のアスタリスクを引いた型です。

int n1; 
n1 = (*p1); 

無効な間接参照は、またはクラッシュを起こさないことがあります。

  • 初期化されていないポインタの任意の参照解除は、クラッシュを引き起こす可能性があります無効な型キャストを参照解除クラッシュ
  • を引き起こす可能性があります。
  • 動的に割り当てられたし、その後もクラッシュを引き起こす可能性がありますので、スコープの外に出た変数へのポインタを参照解除クラッシュ
  • を引き起こす可能性が割り当て解除された変数へのポインタを間接参照。

無効を参照すると、クラッシュよりも、コンパイルエラーを引き起こす可能性が高いですが、それは、このために、コンパイラに依存するのは良い考えではありません。

参考文献:私は常に聞いた

http://www.codingunit.com/cplusplus-tutorial-pointers-reference-and-dereference-operators

& is the reference operator and can be read as “address of”. 
* is the dereference operator and can be read as “value pointed by”. 

http://www.cplusplus.com/doc/tutorial/pointers/

& is the reference operator  
* is the dereference operator 

http://en.wikipedia.org/wiki/Dereference_operator

The dereference operator * is also called the indirection operator. 
13

彼らは反対の意味で使用:

  • &が基準演算子である - それは間接参照演算子であるあなたにいくつかのオブジェクト

  • *への参照(ポインタ)を与える - それはリファレンスを取ります(ポインタ)、参照先のオブジェクトを返します。スタートのために

8

、あなたは後方にそれらを持っている:&は参照であり、*は間接参照です。変数の参照

は、変数のメモリアドレスへのアクセスを意味します

メモリアドレスに格納されている変数にアクセスする変数の手段を間接参照
int i = 5; 
int * p; 
p = &i; //&i returns the memory address of the variable i. 

int i = 5; 
int * p; 
p = &i; 
*p = 7; //*p returns the variable stored at the memory address stored in p, which is i. 
//i is now 7 
+2

ホールドオン、変数iのメモリアドレスは5ではなく、5はiの値です。ではない?メモリアドレスは.. 0XA234948 ...のようなものでなければなりません。 – Nayana

+0

@dockbudu正しい。 iの値は5です。メモリアドレスは、制御できない値(16進数で表現されることが多い)です。 – ApproachingDarknessFish

4

以下の説明を見つける:

int main() 
{ 
    int a = 10;// say address of 'a' is 2000; 
    int *p = &a; //it means 'p' is pointing[referencing] to 'a'. i.e p->2000 
    int c = *p; //*p means dereferncing. it will give the content of the address pointed by 'p'. in this case 'p' is pointing to 2000[address of 'a' variable], content of 2000 is 10. so *p will give 10. 
} 

結論:

  1. & [アドレス演算子]は参照に使用されます。
  2. * [star演算子]は、逆参照に使用されます。