1read 100read
2012年09月プログラム21: なぜポインタで引っかかる人が多いのか (796)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
くだすれC++Builder(超初心者用)その5 (328)
【RAD統合環境】 Qt 総合スレ 14 【Win/Mac/Linux】 (226)
【初心者歓迎】C/C++室 Ver.80【環境依存OK】 (550)
OpenMPプログラミング (388)
画像処理 その13 (876)
Visual Studio 2008 Part 21 (721)
なぜポインタで引っかかる人が多いのか
1 :2010/06/30 〜 最終レス :2012/11/02 なぜポインタで引っかかる人が多いのか 引っかかる人は何に困惑しているのか
2 : ポインタは概念のようなものなので、知ってすぐ使える標準関数やSTL等と違い「何に使えるか」が不明瞭だから
3 : *だから
4 : なぜ雑談スレや質問スレに書き込まずにスレを立ててしまうのか。 クソスレ立てる人はバカなのか死ぬのかpンジーなのか。
5 : 物理メモリにデータをおいてるってイメージがないとね
6 : ポインタって訳すと「指し示す」だろ。 それを*をつかって値を書き換えたらポインタじゃないじゃん。 参照するまでは許す!でもいじったらポインタじゃない!
7 : 数値扱いにもなるのが理由じゃないかな。 それ故に今扱ってるのがデータなのか、アドレスなのかワケが分からなくなる。 アドレス書くべきところにデータを書いてしまったり、逆をしたりしたときに 予測不能な挙動を引き出してしまい、何が起きたのか分からなくなる。 ポインタ型と数値型が明確に区別されて、キャストしないと数値にできず 型エラー出すなら引っかかりにくいと思う。
8 : ポインタはね、メモリのアドレスでしょ。 そんなことは言われればだれだって理解できるんです。 要するに計算用紙の座標がポインタですから。 でも複合型の文法を出した途端、頭の中で処理できなくなるんです。 加えて、配列がポインタとかウソの説明をうけてごらんなさい。 ほら、分からなくなった! そうこうしているうちに関数ポインタの説明まで行くでしょ、 そこまで行ったらなーんとなく概念では分かるけど、 文法は全くわからんちーん。 アドレスだから数値と一緒で計算できるとか勘違いするようになる。 配列のポインタが配列の先頭要素指してるから キャストエラーを無視してもいいとか頭の中が沸いてるんじゃないかと 思う発送をしだすようになる。
9 : 配列がポインタ、は嘘なんだが 言語仕様からして割と混同されてるだろ あれでは分からなくなるのも無理はないかと
10 : でも別にそんなのどうだってよくね? 物理メモリのどっかにあるその領域の先頭を指してるもん的な 意味でしか使ってないぞ>配列 あくまで俺はって話しだけど いちいち配列の先頭とポインタとでごっちゃになっちゃうような使い方してるのって 組んでるプログラムも怪しくねーか? 俺みたいに物理メモリのどっかを指してるモノってとらえてると 配列もポインタって言っちゃう人がいるのかもね ただ、その場合連続してるもんとしてないもんと脳みそに入ってないとダメだけど
11 : 配列式aをa[0]に自動変換できる一部の場合(要するにsizeofとか以外)、 a[2]=2[a]が*(a+2)と等しいことを取って配列と等しいことを指して、 配列とポインタが等しいなんて言う人がいるんだよなあ。 まあもっともポインタが引っかかる人はそれ以前だと思うが。
12 : では配列とポインタはどこが違うのだろうか。 正確な答えを自分は知らない。
13 : >>12 int a[10]; int *b; この時、aは定数、bは変数 a[0]はアドレスa+0を参照する *bは変数bが保持する値をアドレスとしてメモリを参照する printf等でaとbを参照すると、どちらからもアドレスを得られるので混乱の元となる
14 : 等しいものとして扱うとどんなバグが発生するのか例を出して
15 : 領域が連続しているかどうかぐらいの違いしか見えないな でもポインタのアドレスずらして計算なんてぶっちゃけいまやらないからまったく害がないなw
16 : ここはポインタを理解できない人の原因を探るスレッドだろ
17 : 使う→間違える→考えるの繰り返し わからない人はどれもやっていない
18 : アセンブラもやってようやく理解といった感じ
19 : プログラムのお勉強のいいところは やる環境さえあれば、身についてしまうことだ。
20 : int a[10]; int *b=a; で、sizeof(a)=40, sizeof(b)=8;
21 : >>18 俺もそうだったな。学生時代にBASIC→C言語やった時には 全く理由の解らない現象に悩んだもんだ。 メモリの状態によっては期待通りの結果が出たり出なかったりするからまたタチが悪い…
22 : 勉強に使った本が悪いんじゃないかな [C言語ポインタ完全制覇」とか使ってみて理解できないなら別の要因だろうけど それと自分で理解を深めたい時、どういった確認(プログラム)すればいいのかわからない
23 : >>20 みて思った 俺いまだ32bitのアプリ作ってるわ
24 : 64bitは甘え
25 : ・アドレス値の変更可否 ・sizeofの値 違いはこれくらいかな。
26 : アセンブラやってからだと全く困らないんだけどねー。
27 : char *name[]とか見たらウンザリする。 これってname[0]、name[1]などはアドレスを意味するんですよね?
28 : >>27 そうだっけ?
29 : >>2 メモリアドレスという、非常に具体的なものなのだが。
30 : java出身者はこの辺まるでダメだね なんでこんな糞を量産してるの?ってぐらいダメだね
31 : 珍班AIは糞スレ
32 : javaにポインタはないと言ってる香具師は ぬるぽしたことがないんだろうか
33 : >>32 本当はjavaでも理解してなきゃならないよな でもさっぱりわかってねーのがほとんどなの
34 : 見て見ぬふり出来るということ
35 : Z80とC言語を同時期に教えれば、ポインタではまず引っ掛からない 高専電気科は同時期に教えてた
36 : >>32 Java, Cどちらもできるけど、「Javaにはポインタは無い」でいいよ。 ポインタが存在する、っていう説明でも別にいいけど。 あるのはあくまで参照。ポインタ演算は不可能。配列も大概アクセス遅いし。 Java出身者が引っかかるのはC++のオブジェクトが Cで言うオブジェクトと近くて、要するに構造体で値型なところだろう。 >>25 あと&演算子も配列とポインタじゃ変わってくる。
37 : うんと昔、はじめてCを勉強した頃を思い出してみると、 int i; char buffer[100]; char *ptr = buffer; scanf("%d", &i); scanf("%s", ptr); printf("%d", i); printf("%s", ptr); なにこれ?なんでscanfではポインタだけ&がなくて、printfでは両方&がないの? って不思議に思ったな。 この辺でつまづくんじゃね。って一番最初だが。
38 : >>35 おれ6809だったけど、ポインタでは引っかからなかった
39 : まあ、でも別に半年もすれば大抵の人間が理解しちゃうし 2〜3年たっても理解できない奴なんていないし 大した問題じゃないんだけどなw
40 : 理解できない奴は2年も経たずに離脱するからな。
41 : 理解出来ないものに2年も係わるなよ
42 : だから、「2年も経たずに」って書いてあるじゃん。
43 : 開発1年半ぐらいの奴が、関数の引数で**pとせずに*pとしてハマってて、 試しに簡略なメモリマップ書かせてみたら、書けなかった という話を開発のリーダに聞いたんだが、ある意味すごいな
44 : ポインタはわかるけど、引数がポインタのポインタとかになってるとわけわかめ
45 : >>43 意味不明なことやらせんなよ Windowsのはきついだろw
46 : プログラマの人材募集に応募してきたプログラマの面接時の珍回答の例: ・「ダブルポインタは大丈夫ですけどトリプルポインタは自信がありません」 ・「Cの入門書を3冊読んだから書いたことがなくても大丈夫」 ・ランバラルの台詞を引用する
47 : たまたま知る限り全ての処理系でポインタの実装がメモリアドレスを格納する変数なだけで 規格上はポインタがメモリアドレスである保証は無い
48 : >>47 実際、Cインタプリタで、ポインタの実装が(実装言語の)配列インデックスである例はあるよ。
49 : それって翻訳の処理が規格通りじゃないから そもそも規格準拠の処理系じゃないんじゃね? どういう解釈になるんだろ
50 : >1 俺みたいなやつがいるから
51 : PICなんかはコード領域とデータ領域が物理的に分離されてるからな
52 : たしかに何に使えるのかのイメージが湧かない 極力使わないように回避出来ちゃいそうな気もした
53 : >>52 アセンブラのインデックスアドレッシングを拡張したもんだから、 ハード寄りのプログラミングでは必須。 目次なしでも辞書を引けないことはないが時間かかり過ぎ、というのと似ている。
54 : >>52 配列とインデックスを別々にすると変数や引数が多くなって気持ち悪い
55 : int *ip; int n=1; ip += 1; ip += n; ip++; 上3つは全て等価だろうか? int ia[10];int *ip = ia; for(int n=0; n != 10; n++){ *ip + n = n; ip[n] = n; *(ip + n) = n;} 上3つは全て等価だろうか?
56 : >>55 そんなゴミみたいな例を出すからわからなくなる 大事なのはイメージ 物理メモリにおいてある領域にアクセスしようとしてる仕組みのイメージを 脳みそに描くことであって そんな読みにくいコードが読めるかどうかはプログラムの能力とちっとも関係ない
57 : >*ip + n = n; なんだこりゃ
58 : よくわかってない人間が、うっかりすると書いてしまうことがある。 だから、なぜ望んだ動作をしないのかわからず、引っかかるんだ。 読みやすい書き方を提示してやれば、ポインタで引っかかる人間は激減する。
59 : >>55 後半はバグっていて話にならない(>>57 のとおり) 前半は何が聞きたいのかわからない。ポインタに1を足してるという点では等価だが、 評価順序とかアセンブラコードとか言い出したら等価ではないが、質問のポイントが書いていないので 答えようがない。 結論:>>55 はど素人。引っ込んでろ。
60 : 初期化してないものを演算するな
61 : >>60 上のはメモリに対する演算ではなく、ポインタの値を変化させてるだけだから、 参照してない以上、何も問題はない。
62 : >>59 いちいち罵倒せずにはいられんのか。情けない奴。
63 : ポインタ自体は説明すれば分かってくれる。 問題は表記だな。 Cのポインタ関連の表記が悪い。
64 : >>62 罵倒? ど素人に引っ込んでろと書いたら罵倒なのか? あんまり詳しくない方は書かないでもらえますか、とでも書けばいいのか?(ワラ
65 : >>63 でも代替案も却って煩雑だったりするし、 今更ポインタの文法が変わるわけがないので、 慣れてちょうだいとしか言いようがない。 一番いいのはC言語使わないことだけどね。
66 : >>64 バカを晒さないようお願い申し上げます。
67 : >>66 *ip + n = n; とか書いちゃうバカに言われてもwwww
68 : >>67 それは私ではありません。横で見てて見苦しいので 重ねてバカを晒さないようお願い申し上げます。
69 : >>64 罵倒だとも。それがわからない程度の人間というわけでもあるまい?
70 : >>63 BASICにもVARPTRとかVARSEGとかあるけどCのポインタで躓く人には 分からないよ アセンブラ学んだりしてメモリの存在意識してからじゃないと スっと理解するのは難しいんだろうな いきなりC言語から始めると値しか視界に入らないと思う
71 : ジョエル・オン・ソフトウェア http://bit.ly/8YScmk ">私のささやかな経験から言わせてもらうと、伝統的に大学のコンピュータ サイエンスのカリキュラムで教えられているもので、多くの人がうまく理解 できないものが2つあった: ポインタと再帰だ。 "
72 : 短縮URLなんて全くクールじゃねえから。ソースはきちんと示せ
73 : >>71 サンクス。クール内容だった。ポインタの理解が能力の見極めになるのはアセンブリ 言語を知らない人だけだろうな。知ってればレジスタ間接のようなものかですむ。逆に アセンブリ言語知らなくてポインタを理解できる人は尊敬してしまう。どうやって理解に 至ったのかぜひ聞いてみたい。
74 : 俺ほとんどアセンブリ言語知らないけどポインタは理解できたぞ。 はっきりいってポインタはアセンブリ言語知ってるどうのじゃなくて、 どういう型システムがあってああいう文法になるのかっていうことが ポイントなんだと思うよ。
75 : 再帰が理解できないって 高校数学で数列が理解できないレベルだろ 池沼認定
76 : アセンブラなんて知らなくてもポインタは理解できるだろ 大事なのは、いまいじってるデータが物理メモリのどっかにおかれていて そこにアクセスする仕組みがポインタだと理解することだ 一番面倒なところはプログラムの記述といくらにらめっこしてても理解できないっていうところかなぁ? 概念を理解しないといけないってのは義務教育ではあまりないからな 再帰はツリー構造のデータをいじらせれば一発で理解できるから そんなに重要じゃないと思うけどね はじめに教える人間がタコだと苦労しちゃうのかも・・・
77 : >>74 .,>>76 アセンブリ言語知らないと理解できないとは言っていない。知っていれば少しも 難しいものではないと言っている。ほとんど知らないとかではなくまったく知らない 人がどう理解していったのかを知りたい。そういう人を知らないので聞いてみたい。
78 : >>77 データはメモリにおいてあるんだからそこにアクセスする方法が必要になるだろ? って必要にせまられたら一発で理解できたけど 画像とかさ Aパートでロードした画像をBパートでもう一回使いたいんだけど?的な場面で
79 : >>77 俺も同意。 BASICから初めて、その後C言語をやった時はさっぱりだったが 情報処理試験のためにCASLをやったらあっさり理解できるようになった。
80 : 配列とポインタの違いとかもアセンブラ知ってると理解が速いわな。 char *ptr; char buffer[10]; _ptr: dc.l 0 _buffer: ds.b 10 puts(ptr); puts(buffer); move.l _ptr, -(sp) #ポインタを引数に渡す場合 jsr _puts lea _buffer, -(sp) #配列を引数に渡す場合 jsr _puts addq.w #8, sp
81 : むむっ久しぶりなんで間違えた予感。 >lea _buffer, -(sp) #配列を引数に渡す場合 こんなアドレス形式はないな。 pea _buffer だった。失礼。
82 : テレビの中身を知らなくても、テレビを操作することはできる感じでポインタは使うことはできたけど レジスタとメモリがどのように使われるのかを体感したら、理解が深まったのは覚えてる
83 : おまえらレベルの低いところで理解できたつもりになっててワロスw
84 : 週末だというのに煽るしかやることがないなんて可哀想
85 : 賞賛からはほとんど得るものはない 人間は失敗から学んで成長する生き物
86 : >>78 サンクス。 > データはメモリにおいてあるんだからそこにアクセスする方法が必要になるだろ? それだとポインタを使わなくても普通にできることでは? > 画像とかさ > Aパートでロードした画像をBパートでもう一回使いたいんだけど?的な場面で 言語を限らないとメモリーコピー、参照渡しなどポインタを使わない方法もある。 意地悪く書いたけどポインタを使えていると思う。上から目線ですまぬ。
87 : > データはメモリにおいてあるんだからそこにアクセスする方法が必要になるだろ? そこにアクセスする方法にアクセスする方法だろポインタっつーのは
88 : どうやって理解するも何もそのままだろうが
89 : 理解出来ない奴が理解出来ない
90 : 番号付き箱にモデル化されたメモリでの説明で理解した。 アセンブリは知らん。
91 : >>87 ポインタってそんなに複雑なものか? >>80 のコンパイル結果を見ればただの long 定数があるだけだ。 これがポインタの正体。つまりポインタは int や long と同じようにメモリ上にとられる エリア。それをデータのアドレスを入れるために使う。 このプログラムはぬるぽになる。本来の意味でぬるぽが使えるのに感動!
92 : >>86 >それだとポインタを使わなくても普通にできることでは? できねーだろ ハンドル使ってもポインタは回避できないと思う
93 : 知らないことは誰だってあるけど、いいやんとか言って違いも調べず思考停止するやつは向上心もう少し持とうぜ
94 : と、アンカーの使い方もわからない雑魚がいっております
95 : >>92 aというメモリー上のデータにアクセスしてbという変数に入れる。 b = a; どこにポインタを使う必要がある?
96 : >>95 元の話題とまったくつながりが見えないんだけど なんの話してるの?w
97 : >>95 は固定長データしか扱ったことないんだよ そっとしておいてやれよ…
98 : アセンブリ言語を覚えたら 複雑な関数ポインタをスラスラ書けるようになっちゃうの?
99 : アドレスにまつわる文法はアセンブリの方がわかりやすいかもな
100read 1read 1read 100read TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲
【RAD統合環境】 Qt 総合スレ 14 【Win/Mac/Linux】 (226)
Borland C++ Compiler オ ワ タ (313)
新言語を開発したい (290)
電卓作る (223)
【QBASIC互換!?】FreeBasic【GPL】 (512)
C#終了のお知らせ (942)
--log9.info------------------
2010年代を語るスレ (908)
2002〜2004年 (430)
2005〜2006年 (420)
本当はそうだったのか。。。勘違い orz (611)
その昔有名だったテルミ (233)
2chは終わった。。 (498)
最初に覚えた・知った2ch用語 (413)
昔、好きだった女の子の名前を叫んでみるスレ (289)
【目指せ】朝青龍part105【全勝優勝】 (550)
オフ板・懐古主義 (269)
さだまさしは過小評価されすぎていると思う人の数→ (278)
●子供時代の洋服=イジメ・イタズラ・辛かった事● (339)
サンタさんを何歳まで信じていた? (203)
子供の頃に見た夢覚えてる? (359)
時空を超えてレスするスレ (298)
あの無邪気な子供の頃に戻りたいな・・・・ (351)
--log55.com------------------
【AI】元歌手と判別できないレベルのAI歌声合成、名古屋工業大学と音声ベンチャーが開発[12/14]
1000馬力をたたき出す「芸術作品」、アストンマーティンのハイパーカー「ヴァルキリー」のV12エンジンが公開
【環境】地球温暖化対策として大気中に微粒子をまいて太陽光を弱める実験が2019年に始まる[12/16]
【環境】数十年以上も燃え続ける「坑内火災」によって大量の温室効果ガスが排出されている[12/17]
【福島第一原発】福島の除染土の再生利用 福島県以外の8割超「内容知らず」[12/16]
【宇宙】太陽系の最果てに存在する天体「ファーアウト」が発見される、初観測は日本の「すばる望遠鏡」[12/18]
【福島第一原発事故】被ばく線量率が高いと血球・骨髄細胞が減少、福島原発周辺のサルを東北大学などが解析[12/18]
【国際リニアコライダー】“宇宙誕生再現” 巨大実験施設「誘致支持に至らず」「巨額の負担に見合う成果得られない」日本学術会議