1read 100read
2011年10月1期プログラムなぜポインタで引っかかる人が多いのか
TOP カテ一覧 スレ一覧 削除依頼 ▼
・ 次のスレ
ところでお前らってジェネリック使ってる?使わない? UIデザイン s = "" + i;でintをStringに変換するのはなぜだめか いろんな言語で宿題 第五編
なぜポインタで引っかかる人が多いのか
1 :10/06/30 〜 最終レス :11/11/11 なぜポインタで引っかかる人が多いのか 引っかかる人は何に困惑しているのか
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 カテ一覧 スレ一覧 削除依頼 ▲
・ 次のスレ
ところでお前らってジェネリック使ってる?使わない? UIデザイン s = "" + i;でintをStringに変換するのはなぜだめか いろんな言語で宿題 第五編