- 1 名前:デフォルトの名無しさん [2010/06/30(水) 10:22:47 ]
- なぜポインタで引っかかる人が多いのか
引っかかる人は何に困惑しているのか
- 396 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 07:46:40 ]
- >>392
ポインタのほうが構造体よりずっと難しい ポインタは存在しないオブジェクトを指す可能性があるし、表記が複雑になる 構造体のほうが難しいと勘違いするのはポインタを理解していないからだ
- 397 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 11:21:38 ]
- 逆をいえば、存在しないオブジェクトを指さなくて構文が複雑にならない
ようなポインタなら問題ないんだよな JavaやPythonの間接参照に引っかかるようなヤツはそうそうおるまい
- 398 名前:289 mailto:sage [2010/07/18(日) 14:02:41 ]
- ポインタ難し・・・・^^;
- 399 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 15:27:09 ]
- ポインタや構造体のどこが難しいのか理解できない。
Win32APIのほうがよっぽどマンドクセ。
- 400 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 15:32:39 ]
- %pに細工して
printf("%p", p)の出力を 〒100-0014 東京都千代田区永田町1丁目7−1 とかにすればイメージ沸きやすいと思う。 アドレスと値を同列に扱えてしまうのがコンピュータの強みでもあるが 混乱の基なんだよ。
- 401 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 16:42:46 ]
- 哲学的な話になりそうだなw
- 402 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 21:56:05 ]
- もう黙ってアセンブラから入るしかないのでは?
というか、我々の頃は、ちょっと言語がわかるようになったら、自然とそうなっていたような気がするのですがね。
- 403 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 22:05:16 ]
- ポインタは間接参照を表現するものとしては
無駄の多い構文になってるのがアレなだけで こういうアプローチ以外は不可能ってほど難しいものじゃないだろ アセンブリなんてしなくてもよろしい
- 404 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 22:40:32 ]
- そんなものやって役に立つの?
- 405 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 22:41:51 ]
- アセンブリは知らなくても良いけど、メモリ上でプログラムが
どうやって動いてるかの概要ぐらいは分かってないと、 ポインタまわりのデバッグはやりづらいね。
- 406 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 23:20:21 ]
- >>403
無駄が多いと感じる原因は「型」。 メモリ上には型がない。なぜなら必要ないから。 型がなくてもプログラムが動くことが分かれば、 ポインタが (構文の見た目ほどには) 難しくないことが分かる。
- 407 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 23:32:56 ]
- >>406
そのような「型の必要がない」という事実を体験するには、アセンブラをやるのが手っ取りばやい、と。
- 408 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 23:39:29 ]
- byte, word, dword, qword ...
- 409 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 00:21:35 ]
- >>408
masm か‥‥‥。
- 410 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 00:28:08 ]
- masm は構造体も使えたな
- 411 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 04:25:48 ]
- メモリアドレスを指す、参照でしょ?
- 412 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 19:19:38 ]
- ポインタで引っかかるのはC言語のせいだと思う
Cって、ポインタ依存度高過ぎる上に そのポインタの扱いがフリーダムだからなぁ… ポインタ依存度低めで、扱いがそこそこ厳しめなDelphiだと ポインタで引っかかった経験はあまり無いぞ
- 413 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 20:28:28 ]
- Delphi って ObjectPASCAL だろ
- 414 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 20:36:46 ]
- TurboPascal for Windows
- 415 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 20:45:45 ]
- >>412
えーと、つまりポインタ自体の概念は難しくない。 そこに掛かる、文法や、派生概念が捕らえ方を 面倒にしてる。 ってこと?
- 416 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 20:58:11 ]
- >>415
そんな感じかな? 例えば、C言語で 「純粋な参照渡し」が使えたり ポインタに厳格な型があって明示的なキャストをしたとき以外では互換性が無かったり 文字列型をコア機能として持ってたり 動的配列をポインタを使わず使えたり ポインタを利用するような標準ライブラリがそもそもほとんど無かったら? 本当にメモリを扱いたい時にしか使わない概念になってたら ポインタで引っかかる人は相当に少なかったと思う
- 417 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 21:19:25 ]
- 配列か…
配列の制限の多さにビビッタ覚えがあるなぁ。 配列を返すためにも、ポインタを使うんだよ。 と、師匠に言われて、俺の価値観が崩壊した。
- 418 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 22:28:12 ]
- >>415
typedef使えばすっきりするからやってごらん
- 419 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 22:39:10 ]
- もともとアセンブラで書いてた人用の物だから仕方ないね
- 420 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 23:03:57 ]
- たしかにポインタの概念自体は馬鹿でも理解できるものだと思うな
- 421 名前:デフォルトの名無しさん mailto:sage [2010/07/20(火) 18:16:50 ]
- >>416
C#のアンセーフポインタみたいな感じ?
- 422 名前:デフォルトの名無しさん mailto:sage [2010/07/20(火) 21:07:04 ]
- 俺はそのアンセーフポインタとやらを詳しくは知らんが
要は本当にメモリアドレスを扱う以外には使う必要がないってことか? だとしたらまあそこそこ合ってるかな ポインタ自体も出来る限り安全であるべきだとは思うが
- 423 名前:デフォルトの名無しさん mailto:sage [2010/07/20(火) 21:31:43 ]
- 今となっては、安全でないところが、Cのポインタの利点だからなぁ・・・
- 424 名前:デフォルトの名無しさん mailto:sage [2010/07/20(火) 22:29:23 ]
- Cはポインタのせいで最適化がしづらくなっている。
バグもでやすいしね。 一番いいのはCを使わないことだ。
- 425 名前:デフォルトの名無しさん mailto:sage [2010/07/20(火) 22:35:46 ]
- 低レイヤー向けの使いやすい言語を作ろう。
って話はないのかな。
- 426 名前:デフォルトの名無しさん mailto:sage [2010/07/20(火) 23:28:34 ]
- LLVM。
- 427 名前:デフォルトの名無しさん mailto:sage [2010/07/21(水) 05:13:38 ]
- >>425
Cがあるじゃん
- 428 名前:デフォルトの名無しさん mailto:sage [2010/07/21(水) 17:54:38 ]
- >>424
ほとんどの言語はヒープのせいで最適化しづらい。 バグがいやなら、一番いいのは最適化を諦めることだ。
- 429 名前:デフォルトの名無しさん mailto:sage [2010/07/22(木) 21:24:53 ]
- ぼっとんネタ
www.atmarkit.co.jp/news/200909/07/lltv02.html
- 430 名前:デフォルトの名無しさん mailto:sage [2010/07/23(金) 03:21:12 ]
- >>427
Cの領域にGoが侵食し始めてるな。 あと5年もすればC?なにそれ?Cobolとかいうやつ?みたいな扱いになるよ。
- 431 名前:デフォルトの名無しさん mailto:sage [2010/07/23(金) 10:48:10 ]
- カーネルの実装やらC++がいる時点でそれはないわwww
業務開発ではもうC使わないけどな
- 432 名前:デフォルトの名無しさん mailto:sage [2010/07/23(金) 11:12:28 ]
- >>425
Dがあるじゃん
- 433 名前:デフォルトの名無しさん mailto:sage [2010/07/27(火) 23:15:08 ]
- ポインタのポインタのポインタで初めのポインタに繋がったらどうなるの?
- 434 名前:デフォルトの名無しさん mailto:sage [2010/07/28(水) 01:14:47 ]
- 普通は型エラーになるよ。
- 435 名前:デフォルトの名無しさん mailto:sage [2010/07/28(水) 02:43:48 ]
- 元彼の元彼の元彼で初めのエイズに繋がったらどうなるの?
- 436 名前:デフォルトの名無しさん mailto:sage [2010/07/28(水) 03:27:36 ]
- アッー!
- 437 名前:デフォルトの名無しさん mailto:sage [2010/07/30(金) 05:16:26 ]
- ご冥福をお祈りします
- 438 名前:デフォルトの名無しさん mailto:sage [2010/07/30(金) 19:26:59 ]
- int hoge(int a[10])
{ int b[10]; return *a; } aはポインタなのにbは配列 ポインタと配列は似ているとかいう解説にかなり混乱したもんだ スタック・ヒープ・文字列あたりがメモリのどこに確保されるかも 一緒に覚えないとポインタはいつまでたっても和歌ランと思う
- 439 名前:デフォルトの名無しさん mailto:sage [2010/07/30(金) 20:02:39 ]
- この10とかも飾りだしなぁ
- 440 名前:デフォルトの名無しさん mailto:sage [2010/07/30(金) 20:31:36 ]
- 仮引数に[数字]使ってもいいけど、
それが許されるのは配列へのポインタとかだな。 要するに可変長配列とか多次元配列の要素とか。
- 441 名前:デフォルトの名無しさん mailto:sage [2010/07/31(土) 08:01:22 ]
- しなくていい(実際の業務では必要ない)表現のフェイクが多すぎて混乱してるだけじゃね?
配列は領域が単に連続してるだけで先頭だけみたらポインタ 違うとかそういうもんじゃなくて比べられないだろ ポインタの指す先が問題なんであって・・・ mallocでとった領域だって連続してるし char *p = (char*)malloc(sizeof(char)*100); char p[100]; とかどう違う?とか聞いたらまた混乱してしまうんだろか?w こんなもんの違いなんてそう意識することないと思うけどねw
- 442 名前:デフォルトの名無しさん mailto:sage [2010/07/31(土) 08:05:41 ]
- Cのよいところはポインタを無駄にちりばめすぎてて
理解してないとろくなコードをかけないところだな。 ASSERT(ポインタを理解している);と先頭に書いてあるようなもん。 中には五里霧中なままコード書いて金もらってる猛者もいるけどさw
- 443 名前:デフォルトの名無しさん mailto:sage [2010/07/31(土) 11:03:12 ]
- >>441
こいつはバカすぎる
- 444 名前:デフォルトの名無しさん mailto:sage [2010/07/31(土) 11:07:43 ]
- sizeof(p)
p=(char*)0
- 445 名前:デフォルトの名無しさん mailto:sage [2010/07/31(土) 11:54:17 ]
- >>443
夏休みだなw
- 446 名前:デフォルトの名無しさん mailto:sage [2010/07/31(土) 12:19:14 ]
- 俺から見たら>>444の回答を知った上で>>441の言ってることはもっともだと
思うけど、人によって違うのか ここら辺もポインタと配列の違いという話をするときに誤解しやすい要因かもね
- 447 名前:デフォルトの名無しさん mailto:sage [2010/07/31(土) 12:42:33 ]
- >>441は何が言いたいのかよく分からない
配列もポインタも大差ないと言いたいのか?
- 448 名前:デフォルトの名無しさん mailto:sage [2010/07/31(土) 14:09:07 ]
- ぶっちゃけこの違いを意識できないヤツがメモリリーク起こすんだから、「そう意識することはない」というのは乱暴だと思うw
- 449 名前:デフォルトの名無しさん mailto:sage [2010/07/31(土) 14:33:29 ]
- >>441 は多次元配列を考察すれば納得できると思う。
- 450 名前:デフォルトの名無しさん mailto:sage [2010/07/31(土) 17:44:29 ]
- >>444
sizeof(p)は微妙だな ソースまたぐと正常な値返ってこないからなw
- 451 名前:デフォルトの名無しさん mailto:sage [2010/08/01(日) 01:13:39 ]
- 本質的には(アセンブラ的に見れば)
どちらも同じ。
- 452 名前:デフォルトの名無しさん mailto:sage [2010/08/01(日) 03:11:46 ]
- >>451
わかる人からすればもっともな意見だとも思う ただ、言語仕様的には明確に違うし、教える側がその辺はしょって初心者に説明するのが混乱の元だと思う よく分からない例え、不正確な同一視は問題の先送りにしかならないんだよなぁ いつかまとめて乗り越えなきゃいけない日が来る
- 453 名前:デフォルトの名無しさん mailto:sage [2010/08/01(日) 04:38:20 ]
- int main
- 454 名前:デフォルトの名無しさん mailto:sage [2010/08/02(月) 00:14:51 ]
- つまづく
- 455 名前:デフォルトの名無しさん mailto:sage [2010/08/02(月) 00:32:14 ]
- 配列のコピーとポインタのコピーは明確に違う
その点はjavaだろうとpythonだろうと引っかかる人は引っかかる
- 456 名前:デフォルトの名無しさん mailto:sage [2010/08/02(月) 02:31:47 ]
- ポインタ
□→□□□□
- 457 名前:デフォルトの名無しさん mailto:sage [2010/08/02(月) 02:38:54 ]
- でっていう
- 458 名前:デフォルトの名無しさん mailto:sage [2010/08/02(月) 22:18:46 ]
- 下記は完全に同じ意味ですか?
p->a; (*p).a; 同じだとしたら、なぜわざわざ -> という演算子を用意したのでしょうか? 由来とかあったら教えてください。
- 459 名前:デフォルトの名無しさん mailto:sage [2010/08/02(月) 22:26:58 ]
- Cの目的の一つにタイプ量を減らすことってのがあったな。
- 460 名前:デフォルトの名無しさん mailto:sage [2010/08/02(月) 22:43:06 ]
- (void)p->a->b->c;
(void)(*(*(*p).a).b).c; いちいち先頭に戻って挿入するなんて考えられない (void)p[0].a[0].b[0].c; これもなんか嫌だよ
- 461 名前:デフォルトの名無しさん [2010/08/02(月) 22:45:29 ]
- どんだけネストしてんだよw
- 462 名前:デフォルトの名無しさん mailto:sage [2010/08/02(月) 22:57:31 ]
- 超巨大構造体ですか?
- 463 名前:デフォルトの名無しさん mailto:sage [2010/08/02(月) 23:02:44 ]
- (void)foo->super(foo)->hoge(foo->super(foo));
(void)(*(*(*foo).super)(foo)).hoge)((*(*foo).super)(foo)); 一時変数使えよって感じだな DirectXとかlibjpegとかCore Foundationでは構造体と関数ポインタでこんなことやっていたと思う オブジェクト指向っぽく書けるから良く使う手法だけどね
- 464 名前:デフォルトの名無しさん mailto:sage [2010/08/03(火) 00:20:42 ]
- >>460
> (void)(*(*(*p).a).b).c; 配列のポインタとか、関数のポインタとかが複数からむと、そんな記述に現実なるじゃん。 何故構造体だけが -> なんてものを用意されて優遇されているのか。
- 465 名前:デフォルトの名無しさん mailto:sage [2010/08/03(火) 00:27:01 ]
- 配列[]も関数()も構造体->も後置
*だけが前置
- 466 名前:デフォルトの名無しさん mailto:sage [2010/08/03(火) 00:52:40 ]
- 優遇前 (*p).a *(p+i) (*p)()
優遇後 p->a p[i] p()
- 467 名前:デフォルトの名無しさん mailto:sage [2010/08/03(火) 07:29:00 ]
- 関数ポインタpfに対して(*pf)();とpf();が同じになるのだから、
ドット演算子もこの仕様に変えたら p.a.b.c; って書けるじゃん。
- 468 名前:デフォルトの名無しさん mailto:sage [2010/08/04(水) 19:18:18 ]
- ポインタの問題 初級
int a[10]; a[0]=10; a[1}=20; a[2]=a[0]+a[1]; このとき、a[2]はいくつになるか答えなさい
- 469 名前:デフォルトの名無しさん mailto:sage [2010/08/04(水) 19:23:44 ]
- それは配列
- 470 名前:デフォルトの名無しさん mailto:sage [2010/08/04(水) 23:44:59 ]
- 30?
- 471 名前:デフォルトの名無しさん mailto:sage [2010/08/05(木) 13:50:20 ]
- それよりコンパイルが通るのかそれ
- 472 名前:デフォルトの名無しさん mailto:sage [2010/08/05(木) 17:12:40 ]
- ポインタ関係ないだろ
- 473 名前:デフォルトの名無しさん mailto:sage [2010/08/05(木) 18:00:55 ]
- int *x
- 474 名前:デフォルトの名無しさん mailto:sage [2010/08/07(土) 18:13:25 ]
- 汚い尻穴だなあ
- 475 名前:デフォルトの名無しさん [2010/08/07(土) 21:35:18 ]
- int* x
- 476 名前:デフォルトの名無しさん [2010/08/08(日) 23:22:06 ]
- C++をやるようになってからは、以前よりポインタを使わなくなったな。
- 477 名前:デフォルトの名無しさん mailto:sage [2010/08/09(月) 11:55:58 ]
- ポインタでひっかかるってよく言うけど、具体的にポインタの何でひっかかるの?
初期化せずに使うミスをするとかそういうこと?
- 478 名前:デフォルトの名無しさん [2010/08/09(月) 12:32:32 ]
- >>477
こうゆう書き方とかしちゃうんじゃね? *ptr++ ptr+sizeof(*ptr) 正直なんでポインタで引っかかる人がいるのか理解できない
- 479 名前:デフォルトの名無しさん mailto:sage [2010/08/09(月) 12:46:48 ]
- 時間をかければ理解できるが無駄な時間がかかりすぎる気がする
もっと近道は無いのか 無いなら無いことを証明するべきじゃないか と愚痴っているうちに時間が過ぎて行きます
- 480 名前:デフォルトの名無しさん mailto:sage [2010/08/09(月) 14:41:58 ]
- x=20;
p=&x; *p=30; これで、pしか変更してないように見えるはずなのにxが30になる これがポインタのすべてだろ
- 481 名前:デフォルトの名無しさん mailto:sage [2010/08/09(月) 14:50:41 ]
- >>480
そんな程度なら参照でも挫折するだろ
- 482 名前:デフォルトの名無しさん mailto:sage [2010/08/09(月) 14:55:13 ]
- こういうのだろ。
struct node { int value; struct node *next; } struct node *list = ???; struct node *n; // 略 struct node **tmpnext = &n->next; struct node *orgnode = n->next - sizeof (int);
- 483 名前:デフォルトの名無しさん mailto:sage [2010/08/09(月) 14:56:45 ]
- ミスった。
struct node *orgnode = tmpnext - sizeof (int);
- 484 名前:デフォルトの名無しさん mailto:sage [2010/08/09(月) 18:32:09 ]
- >>477
本来ポインタとは、ポインタが何かを理解してる人間だけが使えばいいところを C言語は初心者ですらポインタと無関係ではいられないからだろう。
- 485 名前:デフォルトの名無しさん mailto:sage [2010/08/09(月) 19:02:11 ]
- ポインタ周りの日本語訳が酷いってのが関係してると思うな
どうしてそんな言葉を当てちゃったのみたいな まあ俺自身まだポインタのとこまで勉強してないからよくわからんが
- 486 名前:デフォルトの名無しさん mailto:sage [2010/08/09(月) 19:04:57 ]
- 昔内輪ではやったネタなんだけど
車輪だな しかも劣化した汚ねぇ車輪だな 車輪(スポーク)はケツの皺だな ∴ 汚ねえケツだなぁ ってことで >>482 のような小汚いソースを見るとTDNを思い出す
- 487 名前:デフォルトの名無しさん mailto:sage [2010/08/09(月) 23:02:46 ]
- 2重ポインタあたりは引っかかると思う。
char** t = (char**)malloc(10*sizeof(char*)); int i; for( i=0; i<10; i++){ t[i] = (char*)malloc(100*sizeof(char)); } こんなふうにメモリ取ってこなきゃならんのをけっこう忘れると思う。 あとは int test(int a[5][10]) のような引数の時とか微妙に型チェックがめんどくさかった気がする。
- 488 名前:デフォルトの名無しさん mailto:sage [2010/08/10(火) 02:14:12 ]
- //引っかかる言語
int[] a; a[0] = 0; #引っかからない言語 my @a; $a[0] = 0;
- 489 名前:デフォルトの名無しさん mailto:sage [2010/08/10(火) 02:25:18 ]
- >>487 は判ってないひと
- 490 名前:デフォルトの名無しさん mailto:sage [2010/08/10(火) 23:49:56 ]
- 大きいオブジェクトを生身で渡すとか
ローカルで定義された参照を返すとか
- 491 名前:デフォルトの名無しさん mailto:sage [2010/08/15(日) 14:26:41 ]
- ひたすらもし〜でなければを繰り返して切り分けるより
宣言多くなるかもだけど実質中身同じだしってことか
- 492 名前:デフォルトの名無しさん mailto:sage [2010/08/15(日) 18:07:05 ]
- >>488
それさ、単に宣言してない変数を 自動的に作るってだけじゃね?
- 493 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 00:40:47 ]
- >>487
ポインタ変数を参照渡ししたい場合もあるのですが、それがかなわないので、しかたなしに2重ポインタになる局面は多いと思います。 とはいっても何とかなった場面もありましたが。 hibari.2ch.net/test/read.cgi/tech/1280653311/663
- 494 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 00:51:31 ]
- 2重ポインタw
- 495 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 11:41:57 ]
- しかたなしに、という表現の意図がわからん。
ポインタはなるべく使うべきでないというドクトリンでもあるのか? ポインタを使えばできることはポインタを使えばいいだけのことだろ。
- 496 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 12:32:46 ]
- >>495
C++ なら参照渡しにするでしょうね。そのほうがわかりやすい。 int func(int &*p)
|

|