C言語における「参照」「非参照」の意味
質問
インターネットでいろいろなことを読みましたが、サイトによって書いてあることが違うので、混乱してしまいました。
私が読んだのは
*
参照演算子と
&
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.
関連
-
[解決済み] Linux Socket write() によるBad File Descriptor C
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] ポインタの「デリファレンス」とはどういう意味ですか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] C言語でのポインタ:アンパサンドとアスタリスクはいつ使うのか?
-
[解決済み] C言語のポインタ(宣言と単項演算子)を初心者にどう説明するか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
VSCodeでCプログラムを書くとエラーになる:ソースファイル "stdio.h" を開くことができない
-
[解決済み] "static const" vs "#define" vs "enum"
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] ポインタの「デリファレンス」とはどういう意味ですか?
-
[解決済み] printfにおけるdoubleの正しい書式指定子
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み] ストラクチャーとユニオンの違い