人気サイト様 最新記事

博士ちゃんねる ヘッドライン

レスの強調ウゼェー!というドクターへ

レス内の強調表示をOFFにする コチラをクリックして切り替えてください。設定は30日間Cookieに保存されます。
現在のステータス:強調有効

お前らポインタをわかりやすく説明できますか @ [プログラマー板]


お前らポインタをわかりやすく説明できますか @ [プログラマー板]
1: 仕様書無しさん 2016/06/18(土) 17:43:55.66 .net
箱(変数)の中にはいつもお菓子が入っています。
ある時箱を開けたらこう書いてある紙が入っていました。
「お菓子は戸棚の中です」
このようにお菓子(実体)の代わりに、お菓子がある場所を書いた紙(実態がある場所)を入れておくのがポインタです。

ポインタを使うことで箱にはいらないようなものを、別の場所においたりすることが可能になります。
管理人より:プログラム初学者にとって3番目くらいの壁になる「ポインタ」。データの実体ではなく、参照用のメモリアドレスが入ってる…というだけのことですが、スレ読むとかえって混乱するかも。
2: 仕様書無しさん 2016/06/18(土) 17:53:57.88 .net

住所=ポインタ
住所録=ポインタの配列
8: 仕様書無しさん 2016/06/19(日) 09:54:33.70 .net
>>2
分かりやすい
11: 仕様書無しさん 2016/06/19(日) 13:35:38.42 .net
>>2
例えがうまいのと、例えが(知らない人にも)わかりやすいっていうのは意味が違う。
3: 仕様書無しさん 2016/06/18(土) 17:56:51.78 .net
分かってない人にはどんな言い方をしても伝わらないんだよな
4: 仕様書無しさん 2016/06/18(土) 18:39:26.72 .net
1はまず例えを使わないで説明してくれ
5: 片山博文MZ ◆T6xkBnTXz7B0 2016/06/18(土) 19:59:49.44 .net
記憶媒体はバイト列、つまり、バイトの並びで出来ている。1バイトは0~255の整数データを格納できる。
記憶媒体からある1バイトのデータを取り出すとき、そのバイトがどこにあるのかを、アドレス(住所)で表す。アドレスはデータの場所を表すデータである。

記憶媒体によっては、隣り合った2バイト、4バイト、8バイト、からいっぺんにデータを取り出すことができる。
1バイトのデータと2バイトのデータでは、表せる整数の範囲が異なるので、データの種類によって型を定義し、型が違うデータは種類の違うデータと見なす。アドレスは特殊な型を持っていると見なす。

アドレスを表す型と変数がポインタである。
6: 仕様書無しさん 2016/06/18(土) 23:47:35.55 .net
>>5
わかりにくい
7: 仕様書無しさん 2016/06/19(日) 03:08:27.37 .net
>>5
スレタイ
管理人より:ヒドイww
10: 仕様書無しさん 2016/06/19(日) 09:55:43.44 .net
LD  A, (HL)
とか、こういうアクセス。
12: 仕様書無しさん 2016/06/19(日) 14:35:45.37 .net
エイリアスで通じる
13: 仕様書無しさん 2016/06/19(日) 16:49:45.35 .net
>>1
お菓子の入ってる位置がポインタだよ
紛らわしいことすんな
14: 仕様書無しさん 2016/06/19(日) 16:54:51.29 .net
>>13
まさか今までずっと勘違いしてたの?
お菓子が箱(変数)に入っている。
それだけでなんでお菓子がポインタになるのか?


その後でお菓子の場所を指している所を作る。
お菓子が入っている所は何も変わっていない。
新しく作った場所がポインタだろう。


今までわかりやすい例を見たことがなかったんだね・・・
15: 仕様書無しさん 2016/06/19(日) 19:23:04.95 .net
ポインタには箱の位置を入れることができる
16: 仕様書無しさん 2016/06/19(日) 19:26:24.43 .net
ポインタがわかんない奴は、向いてないどころか頭が悪い証明だから辞めろ
17: 仕様書無しさん 2016/06/19(日) 20:07:08.97 .net
下記ではポインタ変数pは変数aという箱を指している。
箱の中身(お菓子)はどうでもいい。
int a = 1;
int *p = &a;
a = 2; // *pは2となる
18: 仕様書無しさん 2016/06/19(日) 21:59:29.44 .net
int 戸棚 = お菓子;
int *箱 = &戸棚; // 箱の中には「お菓子は戸棚の中です」と書いてある
戸棚 = おもちゃ; // *箱の中の紙が示した場所にはおもちゃが入っている。
19: 仕様書無しさん 2016/06/19(日) 22:11:39.51 .net
ポインタは戸棚を示しているのであって、お菓子ではない。
20: 仕様書無しさん 2016/06/19(日) 22:25:55.91 .net
>>19
int *p = &a;
p ・・・ aの場所
*p ・・・ aの場所の中身

int *箱 = &戸棚
箱 ・・・ 戸棚の場所
*箱 ・・・ 戸棚の場所の中身
21: 仕様書無しさん 2016/06/19(日) 22:42:16.79 .net
>>20
×int *箱 = &戸棚; // 箱の中には「お菓子は戸棚の中です」と書いてある
○int *箱 = &戸棚; // 箱の中には「戸棚は&戸棚の場所にある」と書いてある。

分からないの?
22: 仕様書無しさん 2016/06/19(日) 22:55:45.02 .net
>>21
○と×は反対ですねw

○int *p = &a; // pの中には「1はaの中です」と書いてある
×int *p = &a; // pの中には「aは&aの場所にある」と書いてある。
23: 仕様書無しさん 2016/06/19(日) 23:02:35.12 .net
>>22
p(箱)の中には戸棚のアドレスしか入ってないのに、何故、お菓子をつける?そこ冗長じゃない?
24: 仕様書無しさん 2016/06/19(日) 23:03:55.82 .net
>>23
じゃあ消せばいいじゃないですか?
int *p = &a; // pの中には「○○はaの中です」と書いてある
25: 仕様書無しさん 2016/06/19(日) 23:18:45.77 .net
ここまで>>2よりわかりやすい例えなし。
27: 仕様書無しさん 2016/06/19(日) 23:46:39.10 .net
>>26
未就学児には理解できないのかもね。
でもここに来る以上最低でも中卒以上だろうから、普通は>>2がわかりやすいんだよ。
人としての最低限の理解力を持っていれば、だけどね。
30: 仕様書無しさん 2016/06/20(月) 00:22:00.26 .net
更地の駐車場と自動立体の駐車場でなんか上手く…
32: 仕様書無しさん 2016/06/20(月) 17:22:59.18 .net
ポインタが分からないって人は、まず変数と値というものを正しく理解してない。
33: 仕様書無しさん 2016/06/20(月) 18:33:28.74 .net
ここでの重要な概念は「ポインタ変数」だよな
34: 仕様書無しさん 2016/06/20(月) 20:00:11.28 .net
難しいのはポインタという概念じゃなく、実際に使う時だから
36: 仕様書無しさん 2016/06/21(火) 09:30:07.87 .net
>>34
>>1の例だと、どういうときに使うかも説明しやすいぞ
41: 仕様書無しさん 2016/06/21(火) 20:17:13.82 .net
>>36
説明して、お兄ちゃん?
44: 仕様書無しさん 2016/06/22(水) 01:37:08.08 .net
>>41
めんどくさいから雑に書く

通常は箱(変数)に入れる。
だけど箱には入り切らないほど大きい物を入れたいときに別の場所に、大きい領域を確保して、そこにありますよ(ポインタ)と示すことができる


赤い箱に、青い箱を見ろ、
青い箱に、黄色い箱を見ろ、
黄色い箱に、白い箱を見ろ。っていのがポインタのポインタの略

そして白い箱から赤い箱に戻っていったら循環参照

箱の中にお菓子と一緒に明日の箱は赤い箱です。なんて書いてあるのがリスト構造
管理人より:Cで連結リストの実装を調べてみるのが、一番早いのではないかと管理人も思います。
38: 仕様書無しさん 2016/06/21(火) 12:18:25.97 .net
メモリー装置の内部構造から解説すればいいんだよ。
特定のメモリーセルにアクセスするために設けられた連続した識別番号をな。
そこからどんどん抽象的な話になって、配列にたどり着く。
39: 仕様書無しさん 2016/06/21(火) 15:32:35.63 .net
ポインタは使えば解るからどうでもいいよ
どや顔かアフィか宿題か
52: 仕様書無しさん 2016/06/25(土) 03:31:04.38 .net
ポチに「xx町3丁目8番2号の八百屋にあるリンゴをギってこい」と言ったら、ポチがギってくる

アセンブラレベルで言ったら「CPUの間接参照」ってのを踏まえるとそんなかんじか
53: 仕様書無しさん 2016/06/25(土) 07:35:01.95 .net
CPUで言い始めたら全部ポインタだし。
RISCに絶対アドレスアクセス命令なんてないよ
54: 仕様書無しさん 2016/06/25(土) 14:59:52.59 .net
は?なにいってんだ
プログラムカウンタと勘違いすんな


変数はデータが入ってるメモリセルで、ポインタはアドレスが入ってるメモリセルだよ

ポインタの便利さは構造体の参照渡しが一番実感できる
使わないでも組めるが、使えない奴ほどグローバル変数を濫用する
55: 仕様書無しさん 2016/06/25(土) 15:10:53.86 .net
構造体の参照もだが関数ポインタもな
データ構造もポインタ使わないと効率悪い
ポインタ使わないとC言語の特性を発揮できていないと感じる


僕はバカだからローカル変数を多用する
グローバル変数は必要悪だが、たくさん使える人ってすごいと思う
ある意味才能あると思うよ
管理人より:ここまで読むひとはマしかいないと思うので、「構造体」の解説省略!こういうコンプレックス・データでこそポインタは生きる…ということを言わないと、単純な例ではなんのために存在するのか、なかなか理解できないですよね。
56: 仕様書無しさん 2016/06/25(土) 15:22:20.45 .net
コンパイラが吐いたアセンブラ見ればわかるけど、グローバル変数?すらレジスタインデックスだから

言いたいことは、今どきはポインタをCPUで説明しないほうが良いよってだけ。
57: 仕様書無しさん 2016/06/25(土) 15:29:39.08 .net
アスペかよ
言語の話してるのに


やっすいマイコンだと、メモリを直接追えるから、勉強になるよ
59: 仕様書無しさん 2016/06/25(土) 16:52:42.59 .net
とても分かりやすいスレだな
60: 仕様書無しさん 2016/06/25(土) 20:33:27.75 .net
ポインタポインタって御前らは村上秀一か!!ドラマーの

(´・ω・`)b
11.11追記:ちょっとめんどくさくてスルーしちゃったけど、コメ欄で教えてもらったので。村上秀一は通称「PONTA」さんです。補足どうも~
62: 仕様書無しさん 2016/06/29(水) 18:29:10.98 .net
箱は変数じゃなくて何物でもないと思う。
63: 仕様書無しさん 2016/06/30(木) 02:26:46.35 .net
いや、箱は箱だろ
64: 仕様書無しさん 2016/06/30(木) 06:53:06.09 .net
箱箱ってお前は歌手の山崎か!!(´・ω・`)b
65: 仕様書無しさん 2016/06/30(木) 09:06:39.38 .net
いいえ、人生ゲームに使う様な、8人乗りの車です。
66: 仕様書無しさん 2016/06/30(木) 10:40:27.09 .net
>>65
2ビット目以降が立たないのはバグか?
人生ゲームの車
管理人より:今の若いひとは人生ゲームとかやるのかな?こういうアレなのでして、奇しくも1台1バイトですね。最初は1本だけ(自分)なんですが、結婚したり子供が生まれると数が増えるやつ。マはモテないですから、いつまでも1個めのビットしか立たない…って余計なお世話ですよ、プンスカ!
67: 仕様書無しさん 2016/06/30(木) 15:23:40.84 .net
ポインタはあるアドレスに格納された値のゲッターセッター
68: 仕様書無しさん 2016/06/30(木) 15:42:03.08 .net
そうは言ってもポインタは数値として評価できるし演算もできるからな
69: 仕様書無しさん 2016/06/30(木) 21:40:52.41 .net
ポインターポインターって御前らは勇者ライディーンに出てくるカスロボットか!!(´・ω・`)b
70: 仕様書無しさん 2016/07/01(金) 00:47:55.86 .net
>>69
それボインダーじゃね?
管理人より:ライディーンに出てくる「ボインダー」ってなんでしょう。マジンガーZの「アフロダイA」と、キカイダーの「ビジンダー」の画像ばっかヒットしてよくわからず。もう覚えてない。
72: 仕様書無しさん 2016/07/02(土) 22:53:58.54 .net
Excelできるという想定なら、

セルA1に1、セルB1に2と入力。
セルC1に=1+2と入力すると3になる。
同じく上書きでセルC1に=A1+B1と入力しても3になる。
セルA1やB1の数値を書き換えるとC1の値が変わるが計算式は同じ。

これでいいんじゃない?
75: 仕様書無しさん 2016/07/04(月) 23:58:51.05 .net
ポインタって矢印のやつか?
76: 仕様書無しさん 2016/07/05(火) 00:06:18.39 .net
犬種
ポインター
管理人より:猟犬用に改良されたやつですね。体型がスリム。
79: 仕様書無しさん 2016/07/17(日) 12:36:55.30 .net
大喜利の流れでよい?
80: 仕様書無しさん 2016/07/17(日) 21:46:24.52 .net
おぅ
81: 仕様書無しさん 2016/07/18(月) 10:30:21.01 .net
レーザーで指示するヤツ
82: 仕様書無しさん 2016/08/21(日) 22:11:19.37 .net
女性のパイ乙をつつく手がポインタ

プログラム初学者の鬼門である「ポインタ」を、例えでわかりやすく(?)解説するスレ!
最初の3つの壁が、変数→関数→ポインタなのであり、最初ふたつでつまづくひとは少ないけど、3番目でふるい落とされるひとは多いですね。

これは頭の良し悪しは全然関係ないです。
頭が良くても、バリバリの理系であっても「プログラミング的な考え方」がストンと落ちないひとはすごい多いし、見渡せばプログラマーなんてアホばっかりですよ。
プログラムを学ぼうってひとは、基本的に実利主義のひと多いから、「それができてなにが嬉しいのか?」を明確にしないと伝わりにくいんですね。

で、ここでつまづくひとがあまりにも多いもんですから、解説書でもなんかすごい気合い入れて説明するわけですよ。電話番号が…とか、そういう超わかりづらい例えで…。

これはもう、例えで説明をするから、全然ピンとこないのであって、スレでもちょっと出てるけど、メモリの構造から理解した方が絶対早いですよ。
そうすれば、配列は要するにポインタなのだ…みたいな説明もピンとくるはず。だから、C言語はじめレガシーな言語デフォルトの配列は、後から要素の長さが変えられないし、型をあらかじめ決めないといけないんですねぇ。

連結リストの考え方
で、それだと不便だということで、「連結リスト」という考え方が生まれました。
これは要素ひとつがニコイチになっており、片方にデータの実体が、もう片方に「次の要素へのポインタ」が入ってる式のやつなのでして、終端はnullで判別します。現在いろんな言語で実装されてる「配列」は、だいたいこっちのはずですね。だから途中で切ったりつなげたりできます。

現在よく使われる新しめの言語では、この「ポインタ」という概念を意識して使うことは、もはや(ほぼ)なくなりました。
これは概念がややこしいからなのではなく、ポインタ用に確保した領域を開放し忘れて、メモリリークの原因になるからです。処理系が参照カウンタで常にチェックして、自動で開放する式が今はメイン。
でもこういった低いレイヤーの概念は、一応知っておく方が良いだろうとは思います。 管理人もあんまちゃんと理解してないから、ひとのことは言えないですけどもね。ウフフフ。

なんかスレ見ながら、ちょっと話違うけど、以前50歳くらいのWEBのことまーーったく知らないオッチャン営業マンに、DNSとIPアドレスとドメインの関係についてあれこれ説明したの思い出しましたよ。
もう5時間くらいかけて、深夜までかかって(なぜかふたりでゲラゲラ笑いながら)説明したんですが、次の日の朝聞いたら、1ミリも理解してなかったですよね。もー信じられない。
こういうIT関係の概念を、わからないひとに対して、わかりやすく説明するのは、難しいですよね~。
どうしても「パルスのファルシのルシがパージでコクーン」みたいになっちゃう。
11.19追記:当記事を「駄文にゅうす」さんでご紹介いただきました!
契約前の開発停止…ITはこのへん契約書を巻くと「お互い困る」ってこと、けっこうありますよね…、あるある…。
C言語ポインタ完全制覇 (標準プログラマーズライブラリ)
前橋 和弥
技術評論社
売り上げランキング: 51,913



人気サイト様 最新記事

博士ちゃんねる ヘッドライン

    • ※1 : ドクター・ノオ・ネーム
    • 2016.11.11 21:39
    鳥を見つけると尻尾ピーン片足上げてポイントしてくれる犬のことだろ
    ちなみに俺のポインタは俺が獲ったキジバトを一人で食べやがった
    • ※2 : ドクター・ノオ・ネーム
    • 2016.11.11 21:56
    卒論で試験装置制御のためにプログラムを使ったがポインタを理解できず、頭の悪いプログラムを作ってしまった
    後輩に話を聞くとそれが今でも引き継がれてるあたり、うちの研究室は相当に頭が悪い

    別の場所にあるデータを参照するってことで、リンクやショートカットみたいなもの?
    • ※3 : ドクター・ノオ・ネーム
    • 2016.11.11 22:09
    村上秀一はポンタだろ!!
    • ※4 : ドクター・ノオ・ネーム
    • 2016.11.11 22:37
    新人教育をやったことあるけど、変な例え話をせずに
    スタックとヒープの関係性から説明するほうが分かってもらいやすかった。

    なぜポインタが存在するのかという背景からわかってもらうほうが
    記憶に残りやすいみたい。
  1. >キジバトを一人で食べやがった
    本物のポインタもよく暴走してデータを食い散らかすことが…あわわ、それはマのせいでしたぁ。
    -----------------
    >リンクやショートカットみたいなもの?
    似てるけど、ちょい違うというか参照だけじゃなくて、評価も演算もできます(スレにあるとおり)
    -----------------
    >村上秀一はポンタだろ!!
    ありがとうございます。調べるのめんどうでスルーしちゃったので追記しました。
    -----------------
    >スタックとヒープの関係性から説明するほうが
    管理人もそう思いますよぉー
    • ※6 : ドクター・ノオ・ネーム
    • 2016.11.12 0:53
    ウルトラ警備隊(@ウルトラセブン)に配備されている
    車のなま・・・ゴホゴホ
    • ※7 : ドクター・ノオ・ネーム
    • 2016.11.12 1:57
    ちょうど今授業でポインターとかアレイとかパラミーターとか意味わかんなくてつまづいてる
    • ※8 : ドクター・ノオ・ネーム
    • 2016.11.12 5:55
    ポインタが難しいのは間接参照してるからじゃないよ。
    だいたい間接参照ならポインタを使ってない言語でもやってる。参照という形で。
    10000個の配列を関数にわたすときとか、どんな言語でもコピーしないで参照を渡すでしょ。

    ポインタが難しいのは「情報が消える」ことと「表現が難しい」こと。

    前者は、渡された側では、大元が1個のデータなのか10個の配列なのか100個の配列なのか区別できない。これが嫌な不具合や誤解を招く。結構このことに言及してる解説ってないんだよね。後者はむしろ慣れれば済むので、本質的にはこっちの方がずっと大きな問題だと思う。

    後者は宣言時と使用時を似せようとしたCの設計の問題が大きいが、何年も使っているとこの設計でないとむしろ使いにくくなるから、こればっかりは慣れてもらうしか仕方がない。
    例えば
    int iが&i
    になるのに
    char ptr[100]がptr
    になるところで皆びっくり仰天するのはわかるが、&ptrには別の意味があるから仕方ないのだ。文法的にはptrと書くのを許さず&ptr[0]とさせるべきなんだろうけど、それじゃ書くのに不便だからねえ。
    • ※9 : ドクター・ノオ・ネーム
    • 2016.11.12 9:56
    ポインタの概念は単純なんだけどC言語の紛らわしい表記法がわかりづらいだけなんだよね
    • ※10 : ドクター・ノオ・ネーム
    • 2016.11.12 11:36
    ぬるぽ
    • ※12 : ドクター・ノオ・ネーム
    • 2016.11.12 15:14
    今までHSPとVBしか触らなかったお陰で、ポインタの概念はわかってても使う理由がよくわからないんだよね
    そんなんグローバル変数でええやん、みたいな

    俺にはCは無理か(笑)
    • ※13 : ドクター・ノオ・ネーム
    • 2016.11.12 18:27
    プログラミング始めたのがFortran77だったので未だに感覚的に理解ができない
    売り物のプログラムは作ってないから困ってないけど
    使いこなせたら便利なんだろうなとは思う
    • ※14 : ドクター・ノオ・ネーム
    • 2016.11.13 1:23
    プログラム初心者だけど、ポインタが分からないんじゃなく、ポインタを使う事のメリットが分からん
    メリットが分からなければ勉強する意欲も失せる
      • ※15 : ドクター・ノオ・ネーム
      • 2016.11.13 11:43
      >※14
      ポインタを使わずそのまま関数にデータを渡すとC言語の内部ではそのデータをコピーしてから処理するんだけど
      ポインタを使うことでコピーをしないでそのままデータを書き換えられるんだよ
      値をコピーする処理を挟まないのでそのぶん高速になる

      ハードが発達した現代でもメモリやディスクアクセスの速度はプログラム自体の処理速度からすれば比較にならないほど遅いのでできるだけそういった処理を減らすことが重要なんだよ
        • ※16 : ドクター・ノオ・ネーム
        • 2016.11.13 18:31
        >※15
        だからそれは参照だって言ってんだろこのニワカ
        よく知りもしないで人に教えてんじゃねーよ
          • ※17 : ドクター・ノオ・ネーム
          • 2016.11.13 21:24
          ※16
          C言語に参照渡しなんてねえよw
          というかC++はそんなに知らないけど参照も実態はポインタの別名みたいなもんだろ
            • ※18 : ドクター・ノオ・ネーム
            • 2016.11.14 6:56
            >※17
            だからそんなレベルで人に教えてんじゃねーよって言ってんだよ。
            参照は簡単だけどポインタが難しいのには理由があるんだからわかるまでは黙ってろニワカ。
    • ※19 : ドクター・ノオ・ネーム
    • 2016.11.14 7:23
    ※18
    あなたの言うとおり参照は簡単だけどポインタは管理が難しいから参照という簡易的な機能がついたんじゃないですか
    ポインタで実現できることを少しでも簡単で安全にしようとして生まれたものです
    私はポインタで実現できるメリットの話をしているだけで参照との比較や実装のしやすさは問題にしてないです
    メリットがわからないという質問に対しての答えですからただメリットを挙げただけです
    勝手に参照とポインタでの実装の違いにまで話を広げて難癖つけられても困りますね
    • ※20 : null
    • 2016.11.15 19:08
    止める
  1. トラックバックはまだありません。


コメ欄での議論はおおいにけっこうですが、当サイトではドクター同士の罵り合いは禁止となっております。反論する際には、相手の意見・人格を尊重し、どうぞ冷静に。
*