- 1 名前:デフォルトの名無しさん [2010/06/30(水) 10:22:47 ]
- なぜポインタで引っかかる人が多いのか
引っかかる人は何に困惑しているのか
- 609 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 19:42:14.51 ]
- もしもポインタの*が後置きだったら……
前置版 → 後置版 int *p; → int p*; int (*p)[99]; → int p*[99]; int *p[99]; → int p[99]*; int *(**p[5])[3][2]; → int p[5]**[3][2]*; int (*pf)(void) → int pf*(void); int (*(*(*(*pf)[5])(void))(void))[3]; → int pf*[5]*(void)*(void)*[3]; 結果: 後置版はカッコを付けなくても一意的に意味がつくので、 宣言がすっきりする 後置版の方が本来は読みやすいはずだが、今のところ、 個人的にはかえって読みにくい(「*p」表記に毒されてしまったのか^p^)
- 610 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 20:35:44.53 ]
- 宣言の読み易さはともかく、それは実行コーディングの使い易さ・読み易さと
両立できるのか?
- 611 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 20:44:13.82 ]
- 掛け算との使い分けは?
- 612 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 20:51:39.73 ]
- >>610
使い易さ・読み易さが格段に落ちることは無いと思う ポインタpに対して、(*p)という記述を自発的に封印して p[0]という記述に統一した場面を想像すればいい この場合、実行コーディングの使い易さ・読み易さが 格段に落ちることは無いよね (*seito).kokugo = 100; → seito[0].kokugo = 100; *(*hoge).(*fuga) = NULL; → hoge[0].fuga[0][0] = NULL; 後置版の場合、(*p) が p* に置き換わるだけだから、これは *p が p[0] に置き換わったのと同じことで、やっぱり 使い易さ・読み易さが格段に落ちることは無いのでは? (*seito).kokugo = 100; → seito*.kokugo = 100; *(*hoge).(*fuga) = NULL; → hoge*.fuga** = NULL;
- 613 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 20:57:02.70 ]
- >>611
p* = 10; と p *= 10; の区別が紛らわしいって話だよね それは別の記号を使えばいいだけでは… ポインタの「*」には、*のかわりに@を使うことにする、とか p@ = 10; p *= 10;
- 614 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 20:58:52.09 ]
- 玉突き衝突的にあちこちいじりまくるなら
そのままでよさそうだな
- 615 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 21:23:17.01 ]
- >>614
弄りまくるも何も、文法的には何も弄ってないのだが… 仮に弄っているように見えたとしても、>>612-613で全て完結してる (*p) のかわりに p[0] を使う文法は、今のままのC言語で普通に使える。 後置版を考えるというのは、「全ての(*p) を p[0] に統一しましょう」 と言っているのと同じことで、実は何も弄ってないでしょ? ( (*p)は前置き表現なのに対し、p[0]は後置き表現 ) ただ、それなら「p*」とか「p@」とか書かないで 「p[0]」でいいじゃんって話になるなw
- 616 名前:デフォルトの名無しさん mailto:sage [2011/04/21(木) 11:55:23.48 ]
- メタやメタメタな話をすると速攻思考が固まる人がいるけど
ポインタもその類の気がする。
- 617 名前:デフォルトの名無しさん mailto:sage [2011/04/22(金) 09:54:08.26 ]
- つまり、アリス以下なんだな。
- 618 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 05:57:17.53 ]
- >>609では前置版とか後置版とか書いたけど、実行コーディングのときは
p[0]っていう後置版が存在してるから、わざわざp* などという後置版を 新設する意味は無かった。単にp[0]を使えばよいのだった ならば、宣言時にもp[0]を拝借して、「int p[0];」を ポインタの宣言として使ったらどうか? 今のC言語では、「int p[0];」という宣言は使われてない(コンパイラに怒られる)。 従って、この宣言に何か意味をつけて使用しても、問題は起きない
- 619 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 06:00:26.47 ]
- 使用例
int *p; → int p[0]; int (*p)[99]; → int p[0][99]; int *p[99]; → int p[99][0]; int *(**p[5])[3][2]; → int p[5][0][0][3][2][0]; int (*pf)(void) → int pf[0](void); int (*(*(*(*pf)[5])(void))(void))[3]; → int pf[0][5][0](void)[0](void)[0][3]; なんか微妙だ^p^ 配列との区別がつきにくい… 宣言自体は読みやすい(先頭のintを無視すれば、左から右へ英語読みできる)のだが
- 620 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 06:11:49.34 ]
- ___________
∧_∧∩ /先生!土曜日の早朝にそんなこと ( ´∀`)/< 考えるだけでなく、書込までするのは _ / / / \あまりにも不毛だと思います! \⊂ノ ̄ ̄ ̄ ̄\  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ||\ \ ||\|| ̄ ̄ ̄ ̄ ̄|| || || ̄ ̄ ̄ ̄ ̄|| .|| ||
- 621 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 06:32:33.92 ]
- >>620
懐かしいAAまで使って凝ってるなw そんなお前の方がよっぽど不毛だわ
- 622 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 10:19:21.16 ]
- 表記も分かりにくいけど
最大の問題点はC言語やそのライブラリが ポインタ酷使し過ぎなことだと思う ・参照型が使える ・参照渡しが使える ・文字列は、基本型もしくは構造体である ・配列は明示しない限り範囲外アクセス不可 始めからこのくらいやれば 半端な知識の人間がポインタに触れることはまずなかったはずだし 本当にアドレスを扱いたいとき以外ポインタ使わなかったろうから うっかりさんが大量発生することもなかっただろう C/C++以外にも確かDelphiとかポインタあるはずだが あんまりポインタで詰まるのを聞かない それは本当に滅多に使わないからだと思う
- 623 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 11:16:02.38 ]
- しかし、それをやったらCが何の為に作られたかがボケてしまう。
アセンブラの代わりに使える低水準言語でなくなる事は、本末転倒だと思う。 Cをそのように使いたいなら、C++でお茶を濁せばいいだけだと思う。
- 624 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 12:23:44.25 ]
- 参照こそイラン。
参照なんて結局んところ、[]演算子のオーバーロード時に使いたいだけちゃうんかと。 MyData &operator[](foo f)して、mydata[bar][baz]させたいだけちゃうんかと。
- 625 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 03:29:25.86 ]
- >>623
いや、当然C言語なんだから低水準なものは扱えるべきだよ。 何もポインタ自体を廃止しろと言ってるワケじゃない。 ポインタに依存するものが多過ぎるでしょ、って話。
- 626 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 03:47:38.83 ]
- 配列参照だとインデックスが必要
速度を上げるためのポインタ参照だから
- 627 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 03:53:03.71 ]
- Cが特定の人々にとって分かりにくいのは確かだけど
別にシステムプログラミング用途で不合理、不適合ってわけじゃないからな。 変えろとか言われても知らんがな。
- 628 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 03:54:49.92 ]
- つまりシステムプログラミング以外をする人は全部「特定の人々」なのか
実際は何故かプログラミングの教材にすら使われる言語なのだが
- 629 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 03:58:20.96 ]
- だからEasy Cだかなんだか好きな言語でっちあげろよ
ごね方が謎過ぎる
- 630 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 12:25:36.83 ]
- Joel氏の言う通り、この程度が理解できないならこの仕事するなって事だな
- 631 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 13:50:37.04 ]
- つまりアレだな、スレタイに対する回答は
「高級言語でもないものを、高級言語であるかのように扱ったから」 だな
- 632 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 21:20:11.12 ]
- >>631 もともと高級アセンブラだ
- 633 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 21:30:52.47 ]
- 実際には色んなところで使われちゃうから、そこが問題点
- 634 名前:デフォルトの名無しさん mailto:sage [2011/04/25(月) 02:57:24.98 ]
- 引っ掛かる人間の割合は、さほど変わっていないと思う。
先天的に才能がない人間も、プログラミングをするようになっただけなんじゃね?
- 635 名前:デフォルトの名無しさん mailto:sage [2011/04/25(月) 12:39:41.86 ]
- 先天的に才能が無い人間がいきなりCに触っちゃう機会があること自体がおかしい
- 636 名前:デフォルトの名無しさん mailto:sage [2011/04/25(月) 18:54:12.21 ]
- Cってかっこいいの?
- 637 名前:デフォルトの名無しさん mailto:sage [2011/04/25(月) 18:55:36.13 ]
- C△
- 638 名前:デフォルトの名無しさん mailto:sage [2011/04/27(水) 08:05:24.62 ]
- Cが駄目ならGoを使えばいいじゃない。
- 639 名前:天使 ◆uL5esZLBSE mailto:sage [2011/07/04(月) 23:31:18.49 ]
- これ ; デリミタっていうんだけどさ、これをつけなきゃエラーになるような
そんな言語使ってる奴ってどうみてもゴミだと思うんだけど もしかして「;」これ打ち忘れてコンパイルエラー出すのが楽しいの? そうか、二度と話かけんなよ ゴミは何いってもゴミ
- 640 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 02:37:31.17 ]
- 天使ちゃんマジ天使
- 641 名前:天使 ◆uL5esZLBSE mailto:sage [2011/07/06(水) 15:13:34.56 ]
- ∨∨∨
「「「「「 つまりアレだな、スレタイに対する回答は 」」」」」(キリ ∧∧∧∧∧∧∧∧∧∧(きリッッ!キリッッッッ!!きリッ!!!キリッッッッ!!!! ∨ 「「「「「 「高級言語でもないものを、高級言語であるかのように扱ったから」 」」」」」(←きリッッッ!!!!キリッッ!!!! ∧∧∧(キリ!!
- 642 名前:デフォルトの名無しさん mailto:sage [2011/11/11(金) 10:08:45.32 ]
- ポインタなんて出来るだけ使わなければ良い。
Cが出た頃の昔はポインタで高効率とかあったけど、 今のコンパイラなら最適化が優れてるから 無理に使う必要ない。 ワザと判り難いプログラミングの手本見て、 真似するとか低脳な教え手から習うなよw コンパイラがショボかった昔の技法なんだよ。
- 643 名前:デフォルトの名無しさん mailto:sage [2011/11/11(金) 14:31:23.82 ]
- クソ本が巷に溢れてるのが悪い
- 644 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 15:15:53.57 ]
- >>20
sizeof(b)=8; になるのは何で?bはint型だから4じゃないの?
- 645 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 18:25:06.21 ]
- すくなくともintじゃなくて
int *だわな。
- 646 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 18:26:17.39 ]
- アドレッシングが64BITの環境かもしれんし。
- 647 名前:デフォルトの名無しさん mailto:sage [2012/03/04(日) 21:32:57.04 ]
- ポインタの理解に苦しむこと30年、その間書籍も20冊以上買ったが
全くモノにならなかった。 しかしついさっき、ようやく、ようやく開眼した。 ポインタ変数と、それが指し示すデータの実体を 同じメモリの中で考えるから位置関係が気になって混乱する。 メモリが一つで一直線にあるのではなく、 データ専用のメモリと、ポインタ専用のメモリが別々にあると 考えて、二つを並べることで理解できた。 つまり地面にメモリが二本垂直に突き立っているイメージ。 右のメモリにはデータがあり、 左のメモリにはポインタ変数があって右のメモリのアドレスを指している。 ポインタのポインタなら、三本めのメモリが立っていて 真ん中のメモリのアドレスを指している。 こんな簡単なことだったんだ。 人生が開けた感じ。とても清々しい気持ちだ。 次は構造体を頑張るぞ。
- 648 名前:デフォルトの名無しさん mailto:sage [2012/03/04(日) 23:30:43.74 ]
- ポインタをインクリメントしてデータを破壊しても、原因が理解できなかったりw
30年もかかるんなら、プログラマに向いてねぇよ
- 649 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 00:14:24.98 ]
- ダメだこりゃ。
- 650 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 00:18:44.22 ]
- アドレスって名前はダテでは無いんだけどなー。
>>647の頭の中ではMapみたいにkey領域とvalue領域があるのかなー・・・。
- 651 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 01:12:04.93 ]
- 人が人生のすばらしさに目覚めて感動しているのに
相変わらず君らはレベルの低いレスを付けるのだな。 ポインタで引っかかる人は、みな私のように 頭の中にメモリのイメージを作れずに苦労しているのだよ。 二段メモリの概念は素晴らしい。これでポインタの本を書けるかも。 私を30年も苦労させたリッチーを、卒業祝いに一発殴りたいところだが 亡くなったそうだからチャラにしてやる。 これからはプログラムを作りまくるぞー。
- 652 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 08:33:39.67 ]
- いや30年わからないってそれ明らかに向いてないから
- 653 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 10:13:34.99 ]
- 俺の理解だと int *hoge; の場合、宣言してるのはhogeという変数。
*をつけると変数の中身をアドレスにしてアクセスする。アクセス先の型はintとする。 最初に*hogeはint型だが、*を外したらアドレスになる、と覚えようとしたら混乱した。
- 654 名前:デフォルトの名無しさん mailto:sage [2012/03/06(火) 07:45:17.53 ]
- >>653
そこで多段メモリですよ。 以下のようにイメージすれば、ポインタなんて簡単だ。 先にも言ったとおり、初心者がポインタでつまづくのは、 リニアなメモリの中にデータとポインタが混在したイメージを 頭の中で処理しきれないから。 だったら、処理しやすいイメージに変えてしまえば良い。 実際のメモリ配置がコンパイラの実装に依存する以上、 このイメージが決定的にまずいということはないはず。 1.右のメモリにはデータがある 2.真ん中のメモリには1へのポインタ変数がある 3.左のメモリには2へのポインタ変数がある 4.ポインタ変数に付く*の数は、その変数のあるメモリの 何段前のメモリを見に行くかを示すものである
- 655 名前:デフォルトの名無しさん mailto:sage [2012/03/06(火) 08:24:45.30 ]
- リンクドリストは要素の数だけメモリがあるのか。大変だな。
|

|