ポインタを理解する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Rittai_3D
記事: 521
登録日時: 6年前

ポインタを理解する

#1

投稿記事 by Rittai_3D » 6年前

どうも、3Dです。

今回は、前回のトピック( http://dixq.net/forum/viewtopic.php?f=3&t=13591 )で出てきたポインタについての事です。

自分はポインタが苦手で、C言語を勉強し始めて既に1年が経過しましたが未だに理解できません。

コード:

// ポインタの自分の理解度
int a;  //  メモリ上に4バイト分の領域を確保して、領域の名前をaとする。(ですよね?)
int* b; //  メモリ上に4バイト分の領域を確保し、そこにアクセスするための名前をbとする(この辺から間違えそう…
a=4;   // メモリ上にaという名前で確保された領域に4を代入する(ですよね?)
b=&a; // bで確保されたメモリ上の領域の場所が渡される?(頭の中に???がいっぱい出てきます)
と理解が曖昧です。このトピックでポインタを克服したいと思います。

上の解釈で間違っていること、若しくは前回のトピックのことなどが有りましたら教えて下さい。

また、前回のトピックでへにっくす様が貼って下さったリンクを読みましたが、わかりそうでわからないのでモヤモヤしています。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#2

投稿記事 by softya(ソフト屋) » 6年前

まず、
int* b; // メモリ上に4バイト分の領域を確保し、領域の名前をbとする。この変数はポインタ型である。
って感じですかね。

それぞれ図を書いてみてはどうでしょうか? 型 変数名 仮のアドレス(0x1000など) 値 を記載してください。
① 2行目、3行目の状態。値は不定と書いてください。
② 4行目、5行目の状態。出来ればbとaの関係も矢印でお願いします。

【補足】
ちなみにポインタが4バイトかは環境依存です。
2バイトや8バイトもあります。64bitOSだと8バイトですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KORYUOH
記事: 44
登録日時: 7年前

Re: ポインタを理解する

#3

投稿記事 by KORYUOH » 6年前

概念でよく言われるのが名簿の関係です
宣言と名簿
int a; ○○さん
int* b; xx番の人

という考え方です。

aさんとかbさんとかだと名前を知っていないと呼び出せませんが、
10番の人、26番の人と番号であれば名前を知らなくても呼び出せますね。
C言語を使うと自分の足を誤って撃ち抜いてしまうことがある。 C++を使えばそのような間違いを犯しにくくなる。しかし、やってしまったときには足全体が無くなる。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ポインタを理解する

#4

投稿記事 by ISLe » 6年前

どこぞの古いハード絡みの経験だけに沿って書かれた解説に毒されていますね。

処理系依存ですしnバイト分の領域なんていちいち型から実際のサイズに変換する必要ないですよ。
領域の大きさは宣言された型の値を格納するのに十分な大きさです。
ごく当たり前のことなのでわざわざ書く必要もないと思います。

int a;
int* b;
両方とも宣言された型の値を格納する記憶域を持つ変数を宣言していて、変数aも変数bも値の読み書きの動作自体に違いはありません。

重要なのは値が持つ型の違いだけです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#5

投稿記事 by softya(ソフト屋) » 6年前

書き添えます。
ISLeさんの言われるとおりなので、図を書く時は仮想アドレスは0x1000,0x2000とかグンと離れた値を書いておいてください。
これならサイズを気にしなくて良いですから。

と言うことで改訂版。
int* b; // メモリ上にint*型の領域を確保し、その領域の名前をbとする。この変数はポインタ型である。
って感じでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ポインタを理解する

#6

投稿記事 by ISLe » 6年前

ポインタがどのように使うものでどのように便利なのかというのは、ときにポインタそのものの理解の邪魔になると思います。
ポインタそのものを理解しなくても、使用する場面ごとのパターンを覚えるという使い方をしているひとも数多存在します。

3D_3Dさんが以前書かれた日記と同じ展開にならないとよいですが。

Rittai_3D
記事: 521
登録日時: 6年前

Re: ポインタを理解する

#7

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:まず、
int* b; // メモリ上に4バイト分の領域を確保し、領域の名前をbとする。この変数はポインタ型である。
って感じですかね。

それぞれ図を書いてみてはどうでしょうか? 型 変数名 仮のアドレス(0x1000など) 値 を記載してください。
① 2行目、3行目の状態。値は不定と書いてください。
② 4行目、5行目の状態。出来ればbとaの関係も矢印でお願いします。

【補足】
ちなみにポインタが4バイトかは環境依存です。
2バイトや8バイトもあります。64bitOSだと8バイトですね。
わかりました。ペイントで頑張って描きます。

ポインタは環境依存だったのですか…いままで決まってるものだと思っていました。
初心者です

Rittai_3D
記事: 521
登録日時: 6年前

Re: ポインタを理解する

#8

投稿記事 by Rittai_3D » 6年前

>>KORYUOH様

返信ありがとうございます。
KORYUOH さんが書きました:概念でよく言われるのが名簿の関係です
宣言と名簿
int a; ○○さん
int* b; xx番の人

という考え方です。

aさんとかbさんとかだと名前を知っていないと呼び出せませんが、
10番の人、26番の人と番号であれば名前を知らなくても呼び出せますね。
この考え方は今まで聞いたことがなかったですが、わかりやすいです。

ポインタが理解出来るように頑張ります
初心者です

Rittai_3D
記事: 521
登録日時: 6年前

Re: ポインタを理解する

#9

投稿記事 by Rittai_3D » 6年前

>>ISLe様

返信ありがとうございます。
ISLe さんが書きました:どこぞの古いハード絡みの経験だけに沿って書かれた解説に毒されていますね。

処理系依存ですしnバイト分の領域なんていちいち型から実際のサイズに変換する必要ないですよ。
領域の大きさは宣言された型の値を格納するのに十分な大きさです。
ごく当たり前のことなのでわざわざ書く必要もないと思います。

int a;
int* b;
両方とも宣言された型の値を格納する記憶域を持つ変数を宣言していて、変数aも変数bも値の読み書きの動作自体に違いはありません。

重要なのは値が持つ型の違いだけです。
自分が参考にした資料は古かったようです。

バイト数は書く必要がない!のですね。

>重要なのは値が持つ型の違いだけです。

int,charとの違いということですか?
初心者です

Rittai_3D
記事: 521
登録日時: 6年前

Re: ポインタを理解する

#10

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:書き添えます。
ISLeさんの言われるとおりなので、図を書く時は仮想アドレスは0x1000,0x2000とかグンと離れた値を書いておいてください。
これならサイズを気にしなくて良いですから。

と言うことで改訂版。
int* b; // メモリ上にint*型の領域を確保し、その領域の名前をbとする。この変数はポインタ型である。
って感じでしょうか。
わかりました。画像にはそのように書きます。

ただ、投稿は午後になります。少し用事がありまして。
初心者です

Rittai_3D
記事: 521
登録日時: 6年前

Re: ポインタを理解する

#11

投稿記事 by Rittai_3D » 6年前

>>ISLe様

返信ありがとうございます。
ISLe さんが書きました:ポインタがどのように使うものでどのように便利なのかというのは、ときにポインタそのものの理解の邪魔になると思います。
ポインタそのものを理解しなくても、使用する場面ごとのパターンを覚えるという使い方をしているひとも数多存在します。

3D_3Dさんが以前書かれた日記と同じ展開にならないとよいですが。
>ポインタがどのように使うものでどのように便利なのかというのは、ときにポインタそのものの理解の邪魔になると思います。

自分はいつもこれを考えています。もしかして、自分がポインタを理解できない理由はこれを考えているからでしょうかね。

>ポインタそのものを理解しなくても、使用する場面ごとのパターンを覚えるという使い方をしているひとも数多存在します。

これが一番驚いた事です。理解せずにパターンで覚える人が存在するんですね。

そのパターンとは何でしょうか?ファイルオープンの
FILE* fp;
みたいなものでしょうか。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#12

投稿記事 by softya(ソフト屋) » 6年前

そういえば、5つの回答に5回返答しなくても良いですよ。実質3人ですし。

【補足】ISLeさんのは、中々出来ないんだったら方法を変えてたら?って提案だと思います。
数学の公式を覚えろってのに近い感じかなぁ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

珈琲

Re: ポインタを理解する

#13

投稿記事 by 珈琲 » 6年前

私はMMOのオンラインゲームをやっていたので、「スキルスロットみたいなものだ」と言われて納得できました。(同時にポリモーフィズムも)
スキルウィンドウにスキルの実体があって、ショートカットキー(スキルスロット)にセットすると、そこから呼び出せる
この一連の流れはそのまま
int abc; //スキルの実体の宣言
int* s;  //ショートカットキーの宣言
s=&abc; //ショートカットキーに設定
*s     //ショートカット呼び出し
     

まぁポインタのこの手の喩え話はいくらでもあるので参考にならないかもしれませんが・・・

Rittai_3D
記事: 521
登録日時: 6年前

Re: ポインタを理解する

#14

投稿記事 by Rittai_3D » 6年前

ただいま戻りました。

画像を貼っておきますので、間違えてる部分などを教えてください。
添付ファイル
4-5.png
4-5.png (13.24 KiB) 閲覧数: 4476 回
2-3.png
2-3.png (9.88 KiB) 閲覧数: 4476 回
初心者です

Rittai_3D
記事: 521
登録日時: 6年前

Re: ポインタを理解する

#15

投稿記事 by Rittai_3D » 6年前

>>珈琲様

返信ありがとうございます。
珈琲 さんが書きました:私はMMOのオンラインゲームをやっていたので、「スキルスロットみたいなものだ」と言われて納得できました。(同時にポリモーフィズムも)
スキルウィンドウにスキルの実体があって、ショートカットキー(スキルスロット)にセットすると、そこから呼び出せる
この一連の流れはそのまま
int abc; //スキルの実体の宣言
int* s;  //ショートカットキーの宣言
s=&abc; //ショートカットキーに設定
*s     //ショートカット呼び出し
     

まぁポインタのこの手の喩え話はいくらでもあるので参考にならないかもしれませんが・・・
MMOオンラインゲーム...?自分はゲームをあまりしないのでわかりません...。

好きなものの例えは分かりやすいかもしれませんね。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#16

投稿記事 by softya(ソフト屋) » 6年前

2-3.png の内容の書き換えて矢印を書き加えるだけで4-5は完成します。
なので、必要なのはaとbの値を書き換えるだけなのです。
難しく考え過ぎと思えます。

あとデバッガでよく見てなかったというのも言えるかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 521
登録日時: 6年前

Re: ポインタを理解する

#17

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:2-3.png の内容の書き換えて矢印を書き加えるだけで4-5は完成します。
なので、必要なのはaとbの値を書き換えるだけなのです。
難しく考え過ぎと思えます。

あとデバッガでよく見てなかったというのも言えるかもしれません。
書き換えてみました。これでどうですか?

また、デバッガで見落としも有るかも知れないので明日確認してみます。(10:00以降はPC使用禁止ですので)
添付ファイル
4-5-1.png
4-5-1.png (13.56 KiB) 閲覧数: 4396 回
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#18

投稿記事 by softya(ソフト屋) » 6年前

なにかうまく伝わっていない・・・。

値が不定のままって事はないです。両方共代入なので値が代入されます。
あと矢印は一旦忘れてください。余計混乱させていると思いました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かずま

Re: ポインタを理解する

#19

投稿記事 by かずま » 6年前

理解していない人に図を書いてくださいというのは、無茶なことで、
理解している人が図を描いて示すほうがずっと教育的なことだと、
私は思います。これは、課題の丸投げに解答を示すのとは異なります。

コード:

#include <stdio.h>

int main(void)
{
    int a;
    int *b;
    a = 6;
    printf(" a = %d\n", a);
    printf("&a = %p\n", &a);
    b = &a;
    printf(" b = %p\n", b);
    printf("&b = %p\n", &b);
    printf("*b = %d\n", *b);
    return 0;
}
私のところでの実行結果

コード:

 a = 6
&a = 0047FD08
 b = 0047FD08
&b = 0047FD04
*b = 6
実際に表示されるアドレスは、コンパイラにより上記とは異なります。

int a; と int *b; で a と b を宣言したときのメモリ

コード:

           +------------+
0x0047fd04 |    不定    | b
           +------------+
0x0047fd08 |    不定    | a
           +------------+
a = 6; を実行したときのメモリ

コード:

           +------------+
0x0047fd04 |    不定    | b
           +------------+
0x0047fd08 |      6     | a
           +------------+
b = &b; を実行したときのメモリ

コード:

           +------------+
0x0047fd04 | 0x0047fd08 | b
           +------------+
0x0047fd08 |      6     | a
           +------------+
アドレスの値は問題ではなく、次の図を描けばよい

コード:

           +------------+
0x0047fd04 |     +------------+  b
           +------------+     |
0x0047fd08 |      6     |<----+  a
           +------------+

かずま

Re: ポインタを理解する

#20

投稿記事 by かずま » 6年前

ちょっと訂正。
アドレスの値は問題ではなく、次の図を描けばよい

コード:

b +----------+      a +-----------+
  |     +------------>|     6     |
  +----------+        +-----------+

珈琲

Re: ポインタを理解する

#21

投稿記事 by 珈琲 » 6年前

横からで度々失礼しますが、
勝手ですが最初はショートカットという認識でいいんじゃないでしょうか

画像
windowsのデスクトップに並ぶショートカットファイルのイメージです。
ショートカットファイルはどんな種類でも、ファイルパスを指すだけなので、ファイル自体の容量は非常に少ないです。

ファイルパスを設定すればその先に設置してあるファイルにアクセスできるわけです。

int File;//ファイル
int* Shortcut = &File;//ファイルパスを設定

Rittai_3D
記事: 521
登録日時: 6年前

Re: ポインタを理解する

#22

投稿記事 by Rittai_3D » 6年前

>>かずま様

返信ありがとうございます。
かずま さんが書きました:理解していない人に図を書いてくださいというのは、無茶なことで、
理解している人が図を描いて示すほうがずっと教育的なことだと、
私は思います。これは、課題の丸投げに解答を示すのとは異なります。

コード:

#include <stdio.h>

int main(void)
{
int a;
int *b;
a = 6;
printf(" a = %d\n", a);
printf("&a = %p\n", &a);
b = &a;
printf(" b = %p\n", b);
printf("&b = %p\n", &b);
printf("*b = %d\n", *b);
return 0;
}
私のところでの実行結果

コード:

a = 6
&a = 0047FD08
b = 0047FD08
&b = 0047FD04
*b = 6
実際に表示されるアドレスは、コンパイラにより上記とは異なります。

int a; と int *b; で a と b を宣言したときのメモリ

コード:

+------------+
0x0047fd04 | 不定 | b
+------------+
0x0047fd08 | 不定 | a
+------------+
a = 6; を実行したときのメモリ

コード:

+------------+
0x0047fd04 | 不定 | b
+------------+
0x0047fd08 | 6 | a
+------------+
b = &b; を実行したときのメモリ

コード:

+------------+
0x0047fd04 | 0x0047fd08 | b
+------------+
0x0047fd08 | 6 | a
+------------+
アドレスの値は問題ではなく、次の図を描けばよい

コード:

+------------+
0x0047fd04 | +------------+ b
+------------+ |
0x0047fd08 | 6 |<----+ a
+------------+
かずま さんが書きました:ちょっと訂正。
アドレスの値は問題ではなく、次の図を描けばよい

コード:

b +----------+ a +-----------+
| +------------>| 6 |
+----------+ +-----------+
図を書いて下さりありがとうございます。とてもわかりやすかったです。

さらに質問ですが、アドレスが代入されるとはどういう意味でしょうか?

a=6 とするとaの領域に6が代入されますが、 b= &a は bの領域にaのアドレス( 0x0047fd08 )が代入されるとは b = 0x0047fd08 と言う意味ですか?
初心者です

Rittai_3D
記事: 521
登録日時: 6年前

Re: ポインタを理解する

#23

投稿記事 by Rittai_3D » 6年前

>>珈琲様

返信ありがとうございます。
珈琲 さんが書きました:横からで度々失礼しますが、
勝手ですが最初はショートカットという認識でいいんじゃないでしょうか

画像
windowsのデスクトップに並ぶショートカットファイルのイメージです。
ショートカットファイルはどんな種類でも、ファイルパスを指すだけなので、ファイル自体の容量は非常に少ないです。

ファイルパスを設定すればその先に設置してあるファイルにアクセスできるわけです。

int File;//ファイル
int* Shortcut = &File;//ファイルパスを設定
うーん、よくわからないです...

File が c:\windows\system32\cmd.exe だとすると、 Shortcut はどうなるのですか?
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#24

投稿記事 by softya(ソフト屋) » 6年前

分かった気がするが一番危険なので気をつけてくださいね。

>a=6 とするとaの領域に6が代入されますが、 b= &a は bの領域にaのアドレス( 0x0047fd08 )が代入されるとは b = 0x0047fd08 と言う意味ですか?

はい。代入ですから。これだけ見れば単純ですよ。

【補足】
ポインタ値を代入する時はとても単純です。
これを参照したりする時にいろんな機能・効果が出てきます。
ただ、ここで理解すべきことはポインタ変数に入っているはポインタ値と言うただの数値であると言う一点です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Lawliet
記事: 12
登録日時: 6年前

Re: ポインタを理解する

#25

投稿記事 by Lawliet » 6年前

いろいろな方たちが説明してくれていますが
それぞれに異なった方針を持っている人もいますので、ごちゃごちゃしてしまう場合は
違う方の説明を聞くときはほかの方の説明を半分ぐらい忘れた状態で聞くといいと思います。
(わからないことが残っても一旦理解したらそのあと質問すればいいので)

文法の面からひとこと言わせてもらいます。
「宣言の時」と「そうじゃない時」を分けて考えるとわかりやすいかもしれません

コード:

////////////////////////////////
//宣言の時

int *p;	//宣言の時は'*'を付ける

////////////////////////////////
//そうじゃない時

/*アドレスを示す状態*/
p;	//代入されたアドレスを示します

int x;
p = &x;	//アドレスを代入することができます。pの指すアドレスが変わります

/*値を示す状態*/
*p;	//pで示しているアドレスの変数の中身を示す

*p = 10;	//pの型の対応する値代入できます。pの指すアドレスの先の変数の値が変わります。

////////////////////////////////
//アドレスを求める演算子

//'&'を付けるときはその変数のアドレスがほしいとき、
//例えばアドレスを代入したい時など

p = &x;
わかりにくかったかもしれませんが結局何が言いたいかというと
  • ポインタ変数の宣言のときは                  *を付ける
  • ポインタ変数の示すアドレスを示すときは           何もつけない
  • ポインタ変数の指すアドレスにある変数の値を示すとき   *を付ける
  • その変数自体のアドレスを示すときは             &を付ける
これらをしっかりと区別してほしいということです。

Rittai_3D
記事: 521
登録日時: 6年前

Re: ポインタを理解する

#26

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:分かった気がするが一番危険なので気をつけてくださいね。

>a=6 とするとaの領域に6が代入されますが、 b= &a は bの領域にaのアドレス( 0x0047fd08 )が代入されるとは b = 0x0047fd08 と言う意味ですか?

はい。代入ですから。これだけ見れば単純ですよ。

【補足】
ポインタ値を代入する時はとても単純です。
これを参照したりする時にいろんな機能・効果が出てきます。
ただ、ここで理解すべきことはポインタ変数に入っているはポインタ値と言うただの数値であると言う一点です。
つまり、普通の変数とほぼ同じで、入っている値の違い、という事ですか?
初心者です

Rittai_3D
記事: 521
登録日時: 6年前

Re: ポインタを理解する

#27

投稿記事 by Rittai_3D » 6年前

>>Lawliet様

返信ありがとうございます。
Lawliet さんが書きました:いろいろな方たちが説明してくれていますが
それぞれに異なった方針を持っている人もいますので、ごちゃごちゃしてしまう場合は
違う方の説明を聞くときはほかの方の説明を半分ぐらい忘れた状態で聞くといいと思います。
(わからないことが残っても一旦理解したらそのあと質問すればいいので)

文法の面からひとこと言わせてもらいます。
「宣言の時」と「そうじゃない時」を分けて考えるとわかりやすいかもしれません

コード:

////////////////////////////////
//宣言の時

int *p; //宣言の時は'*'を付ける

////////////////////////////////
//そうじゃない時

/*アドレスを示す状態*/
p; //代入されたアドレスを示します

int x;
p = &x; //アドレスを代入することができます。pの指すアドレスが変わります

/*値を示す状態*/
*p; //pで示しているアドレスの変数の中身を示す

*p = 10; //pの型の対応する値代入できます。pの指すアドレスの先の変数の値が変わります。

////////////////////////////////
//アドレスを求める演算子

//'&'を付けるときはその変数のアドレスがほしいとき、
//例えばアドレスを代入したい時など

p = &x;
わかりにくかったかもしれませんが結局何が言いたいかというと
  • ポインタ変数の宣言のときは                  *を付ける
  • ポインタ変数の示すアドレスを示すときは           何もつけない
  • ポインタ変数の指すアドレスにある変数の値を示すとき   *を付ける
  • その変数自体のアドレスを示すときは             &を付ける
これらをしっかりと区別してほしいということです。
何となくわかったような気がしますが、softya様のおっしゃる通り「分かった気がするが一番危険」なのでしっかり理解していきたいです。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#28

投稿記事 by softya(ソフト屋) » 6年前

3D_3D さんが書きました:つまり、普通の変数とほぼ同じで、入っている値の違い、という事ですか?
値の違いとも言えません。
int型とint*型にメモリ上は同じ値が入っていても参照するときの動作が違うからです。
なので整数型とポインタ型による動作の違いは参照時の動作の違いです。

例えば0x1000と言う値の場合、int a=0x1000;なら16進数で0x1000で10進数で4096です。
int *b=0x1000;なら0x1000がポインタ値となるのでint c = *b;と書けば0x1000番地に書かれてるメモリの内容をint型として参照してint型のcに代入します。
0x1000(仮想アドレス)がint x=100;であるなら、cには100が入ります。

※ パソコンの場合、アドレスは自動で決まるのでこんな決め打ちはできません。あくまでシミュレーションです。

【補足】
かずまさんが書いたことで逆に混乱しそうなsので補足しておきます。
int *b=(int *)0x1000;
と書かないとC言語の文法エラー出ます。でも言いたいことは文法じゃなく値の意味なので省略しました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ポインタを理解する

#29

投稿記事 by ISLe » 6年前

見事に日記のコメント欄と同じ展開ですね。

ポインタ型の変数に値が格納されるイメージを図にしてもらう段階で、ポインタが何をどうやって指すかというイメージは先行し過ぎじゃないかと思うのですが。

ポインタの機能重視で、使い方で覚えろという意見が圧倒的多数なので、パターンで覚えるのも良いかもしれません。
新しいパターンに出会うたびに苦労されるかもしれませんが。
最後に編集したユーザー ISLe on 2013年8月06日(火) 18:30 [ 編集 2 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#30

投稿記事 by softya(ソフト屋) » 6年前

ISLe さんが書きました:見事に日記のコメント欄と同じ展開ですね。

ポインタ型の変数に値が格納されるイメージを図にしてもらう段階で、ポインタが何をどうやって指すかというイメージは先行し過ぎじゃないかと思うのですが。

ポインタの機能重視で、使い方で覚えろという意見が圧倒的多数なので、パターンで覚えるのも良いかもしれません。
新しいパターンに出会うたびに苦労されるかもしれませんが。
そっちに切り替えましょうか。3D_3Dさんも混乱されているようですし。
【補足】 決めるのは3D_3Dさんなので、方針変更されても問題ないですよとだけ言っておきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る