- ベストアンサー
ポインタの意味がわからず困っているのですが、ポインタとは何ですか?
- ポインタはメモリのアドレスを格納する変数であり、他の変数のアドレスを指すことができます。
- int型の変数aとint型のポインタ変数bを宣言した場合、aの値はアドレス10に、bの値はアドレス20に格納されます。
- b = &a;とした場合、bの値にはaのアドレス10が格納されます。また、b = 30;とした場合、bのアドレス20に値30が格納されます。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>(2)b = a; 型が違う(左辺はポインタ、右辺は整数)ので代入できない。 >(3)b = &a; ご理解の通り。 >(4)b = 30; 型が違う(左辺はポインタ、右辺は整数)ので代入できない。 >(5)b = &a 少し違います。*b = 30; これならご説の通りですが、 b = 30;は(4)と同じ理由でできません。 実際に動作するコードでは、b = &a; は最終的には b = 10;に なります。但し、コンパイルだけではアドレスの解決という問題が 残るので、ロードモジュールを作る時にリンクする必要があるのは ご存じですね? ここで、代入する値がアドレスか、定数かで、リンカの対処が 違ってきます。定数はそのままですが、アドレスだとマップに 登録してプログラムヘッダに記録させる動作が入ります。 だから、初心者には「型が違うからできません。」と答えて いるのです。 ポインタに整数値を代入することはある技を使えば可能ですが、 何もかも承知の上でやる必要があります。
その他の回答 (5)
- ricardo_
- ベストアンサー率19% (14/72)
C言語のポインタ仕様が分かり難くて問題だと思います。 次のような言語仕様で考えれば、理解の助けになると思います。 int *b の代わりに p-int b このようにして下記の仕様で考えれば、int 変数は常に2バイト、p-int 変数は4バイトとなります。 int *e, f などと混在するから分かり難い。 私の組み込みマイコンの仕様だと次のようになります。 char 1バイト int 2バイト char* 4バイト int* 4バイト b=30 は4バイト領域に30を書き込みます。 その後 *b=40 とすれば、30番地からの2バイト領域に40を書き込みます。 b=&a は、aが有る2バイト領域のアドレスをbに書き込みます。アドレスは4バイト構成。 *b=a は、2バイトのaの内容を4バイトのbで表されるアドレスから2バイト書き込みます。
お礼
回答頂きありがとうございました。 ”int *e,f”という宣言をしても、メモリへの構成が違うので、 p-int *e; int f; と変数型が違うのだと考えなければいけないのですね。 確かに、このように考えれば、メモリにどのように配置されるのかということを意識するときには 大変便利ですね。
- tsuduki123
- ベストアンサー率32% (21/65)
ポインタの概念に話を絞りますね 他の方の回答を読むときの参考になればと思います。 プログラムが実行されるメモリ空間をホテルに見立ててからめながら説明します。 ※ ()内にC言語的な補足を混ぜておきます。 ホテルには、ルームナンバー(アドレス)と シングルやツインといった感じで部屋の種類(型)がありますね そして部屋(変数)には、ルームナンバー(アドレス)があらかじめ割り当てられています。 それぞれの部屋には対応するルームキー(ポインタ)があるわけです。 また、ルームキーそのものの大きさ(バイト数)は部屋の大きさには影響されません ここでC言語に話戻して説明すれば 部屋のルームナンバー知るための記述が &a です。 部屋とルームキーを結びつける操作が b = アドレス という記述で そして、部屋の中からものを取り出すための操作が *b という記述です。 (2)の質問にあった b=a は bが結びつくルームナンバーが 30に設定されるだけです このポインタを使って中身を取り出そうとしたときに 存在しない部屋だったりまるで違う部屋(倉庫とか)だったりすると プログラムがどうなってしまうのかは想像に難しくないと思います。 以上参考にしてください
お礼
回答頂きありがとうございました。 ポインタを考えるためのイメージを頂きありがとうございました。 活用させていただきます。
- asuncion
- ベストアンサー率33% (2127/6289)
>int *b; と宣言した場合、*bのメモリアドレスには何か決まった値は入っているのでしょうか? すみません。意味を取り違えていました。 int *b; と定義しただけのとき、 1)定義場所が関数の中であれば bの値は不定(ゴミ、どこを指しているかわからない) *bの値も不定 2)定義場所が関数の外であれば bはNULL(どこも指していない) *bにアクセスしようとしたときに、たぶんプログラムは落ちる
お礼
回答頂きありがとうございます。 ポインタを宣言したら必ずb=&aのようにbのメモリにポインタデータを必ず入れるというのがポインタの使い方のようですね。そういう使い方をしないといけないというのがポインタ何だと思いました。
- asuncion
- ベストアンサー率33% (2127/6289)
>int *b; と宣言した場合、*bのメモリアドレスには何か決まった値は入っているのでしょうか? どこで定義(宣言ではありません)しているかによります。 定義している場所は関数の中ですか?外ですか?
お礼
”関数の中”で定義した場合と、”関数の外”で定義した場合の2種類が知りたいです。 まず、この場合、 void main(void) { int *b; *b = 30; } それと、外でグローバルとしての場合 int *b; void main(void) { *b = 30; }
- anicicle
- ベストアンサー率36% (129/356)
A1. 「メモリ上のどこか」に宣言した型に対応したサイズが確保されます。 A2. できます。 「アドレス20」に「a(アドレス10)の内容である何か」が格納されます。 「何か」と書いているのは、変数を宣言しただけではその内容は不定の為です。 尚「計算」ではなく「代入」です。 A3. はい。 但し表現が違います >*bのメモリアドレス20に10が格納される。 ではなく bのメモリアドレス20に10が格納される。 です。頭の「*」は不要です(後述)。 A4. はい。 「bのアドレス20」に「30」が格納されます。 これも頭の「*」は不要です。 A5. いいえ。 「bのアドレス20」に「30」が格納されます。 一度整理 (1) int a; アドレス10に確保 int *b; アドレス20に確保 アドレス10の内容:??? アドレス20の内容:??? (1)→(2)b = a; アドレス10の内容:??? アドレス20の内容:???→???(aの内容が入るが、アドレス10の内容は不明なため) (1)→(3)b = &a; アドレス10の内容:??? アドレス20の内容:10(aのアドレスが入る) (1)→(4)b = 30; アドレス10の内容:??? アドレス20の内容:30 (1)→(5)b = &a アドレス10の内容:??? アドレス20の内容:10(aのアドレスが入る) >これをやってから、b = 30 アドレス10の内容:??? アドレス20の内容:10→30 尚、ポインタ変数は宣言の時「int *b」と 実際に使用する場合の 「b = 99」と「*b = 99」では意味が違うので注意 「b」は「bが宣言されたメモリアドレス」です。 「*b」は「bの宣言されたメモリアドレスに「格納されている内容をメモリアドレスとしてみる」」です。
お礼
回答頂きありがとうございます。 プログラミングの初心者なもんで、詳しい方たちにこのような問題を相談する場合にどのような言葉で伝えればいいかというのをいつもわからずにいたので、今後教えて頂いたような伝え方を活用させて頂きます。
お礼
回答頂きありがとうございました。1つ1つ答えて頂きたすかります。 >(5)b = &a >少し違います。*b = 30; これならご説の通りですが 確かに”*b = 30”にしなければいけないですね。 ふと疑問に思ったのですが、 //b = &a これをせずに、 *b = 30 とやってしまった場合、プログラムはどのような動きをするのでしょうか? int *b; と宣言した場合、*bのメモリアドレスには何か決まった値は入っているのでしょうか?