int x=0;
と与えられているとして、
もし仮に
*x=??
と何か代入したらxつまり0が格納されているメモリアドレスが変わるのでしょうか?
関数内でしたら
*xに値渡しがされているとすると
**x=??
になります。
つまり既に値が与えられているもののアドレスを変更するとその値の格納場所は変わるのか?ということです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
いまいち言ってることが意味不明ですが、、
int x=0;
としている場合のxのアドレスは &x です
*x としてしまうと(ワーニングやらエラーが出るでしょうが)、xの内容のアドレスのアクセスとなり(0番地のアクセス)、アクセス違反となります
x のアドレスを持ってきてなんやかやしたいなら、
int x=0;
int* p=&x;
*p =1;
とかなんとかになりますね
投稿2018/12/16 23:26
総合スコア87774
0
こんにちは。
int *x=0;
と *x=0;
の意味を混同されているように思います。
この2つの表記はちょっと似ていますが、全く意味が異なるのです。(個人的にはC言語の黒歴史と思います。)
前者は int* x=0;
と捉えたほうが理解しやすいです。int*
はint型へのポインタ型を意味しますから、int型ポインタ x を宣言し、0で初期化しています。(ポインタxが0番地を指すように設定する。)
後者は、ポインタ x が指すメモリを 0 クリアしています。
もしも下記のように記述すると、ほとんどの処理系で不正メモリアクセスにて落ちます。
C++
1int* x=0; 2*x=0;
xはアドレス0番地を指し、その0番地に 0 を設定しようとしています。ほとんどの処理系で0番地にはメモリが割り当てられていませんのでアクセス違反となります。
投稿2018/12/17 06:59
編集2018/12/17 07:01総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
つまり既に値が与えられているもののアドレスを変更するとその値の格納場所は変わるのか?ということです。
「値が与えられているもののアドレスを変更する」ことはできません。
Aさんの住所が3番地でしたので、住所録に「3番地」と書きました。その後3番地を「2番地」に書き換えました。Aさんは3番地から2番地へ引っ越したのでしょうか?
と同じような質問に思えます。
変更することができるのは、
「保持しているアドレスの値を変更する」つまり、住所録を書き換える
ことです。引っ越したかどうかとは無関係です。
もし、3番地から2番地へxの値を移動したいのなら、3番地から2番地へのデータのコピーを明示的に記述する必要があります。
「アドレスを保持しているもの(変数)」が"ポインタ"です。
ポインタは「矢印」のようなものです。矢印の向きを変えたからといって、矢印が示す対象が移動する訳ではありません。
以上が答えになっていますか?
投稿2018/12/17 02:17
総合スコア711
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
皆様のおかげで理解しました、ありがとうございました。
ポインタもただの変数に過ぎない、という視点が抜けていました。
投稿2018/12/26 10:16
編集2018/12/26 10:32退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
>xつまり0が格納されているメモリアドレスが変わるのでしょうか?
xのメモリアドレスが変わるわけではありません。
*(int )x = ?? だと、xをポインタと見なした場合の参照先を書き換えます。
ただし、xの値は0なので、ヌルポインタの参照先にアクセスすることになるので何が起こるかわかりません(通常はアクセス違反になるが、仕様としてはエラーメッセージが出る保証もありません)。
(厳密に言うと、仕様上はint x=0;のとき(int)x がヌルポインタになる保証さえありません。(int *)0 と整定数の0をポインタにキャストされた場合にヌルポインタになることが保証されてるだけです。c言語の闇中の闇です。まずヌルポインタになるので今は気にしなくていいですが)。
int a = 1; int b = 2; int*x = &a; x = &b; *x = a;
だと、*x (xが指しているオブジェクト)のアドレスがbのアドレスに変わってます。最後の文で代入することでbの内容がaの値になります。このように代入などすれば値は変わりますが自動的にbの値がaの値になるわけではありません。
投稿2018/12/22 08:27
総合スコア100
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
int x=0;
と与えられているとして、
もし仮に
*x=??
と何か代入したらxつまり0が格納されているメモリアドレスが変わるのでしょうか?
この場合、x
はポインタじゃないので*x=??;
というのは出来ません。コンパイル時にエラーになります。
int *x; int a=0,b=1;
の宣言で、x=&a;
だと*x
は0
になります。その後、x=&b;
にすると、*x
は1
になります。
投稿2018/12/16 14:27
総合スコア84555
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/12/16 23:56
2018/12/17 00:17