1. ホーム
  2. c

C言語における「参照」「非参照」の意味

2023-11-14 02:54:55

質問

インターネットでいろいろなことを読みましたが、サイトによって書いてあることが違うので、混乱してしまいました。

私が読んだのは * 参照演算子と & dereferencing演算子、あるいは、参照とはポインタを変数に指し示すことで、dereferencingとはポインタが指し示す変数の値にアクセスすることである。だから混乱してしまった。

参照と非参照について、簡単で丁寧な説明をお願いします。

どのように解決するのですか?

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

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.