- 1 名前:デフォルトの名無しさん [2010/06/30(水) 10:22:47 ]
- なぜポインタで引っかかる人が多いのか
引っかかる人は何に困惑しているのか
- 377 名前:デフォルトの名無しさん mailto:sage [2010/07/17(土) 13:30:16 ]
- 入門書の間違いなんて、たまたまそれに嵌って痛い目にあったりでもしない限り、
いちいち覚えちゃねえよ。 複数言語やってりゃ、記述が間違っていても何となく回避してるし。 子どもの時に乗った三輪車の善し悪しなんぞ誰もわからんのと同じ。 ぐだぐだ言うのは、三輪車をとっかえひっかえしている池沼と、書いた著者くらいのもん。
- 378 名前:デフォルトの名無しさん mailto:sage [2010/07/17(土) 14:44:43 ]
- それはそうかも
- 379 名前:デフォルトの名無しさん mailto:sage チラ裏スマソ [2010/07/17(土) 14:57:17 ]
- >>375
デリとな
- 380 名前:デフォルトの名無しさん mailto:sage [2010/07/17(土) 18:26:10 ]
- >>377
複数言語やってても、そこにポインタ扱う言語が無かったらやっぱ引っかかるよ
- 381 名前:デフォルトの名無しさん [2010/07/17(土) 21:35:13 ]
- >>373
Javaじゃないからガッしてくれないよ
- 382 名前:デフォルトの名無しさん mailto:sage [2010/07/17(土) 22:55:15 ]
- スマポで引っかかりました。
詳細は以下から。 class Dog : public IAnimal というクラスがあって、これをスマポでインスタンスを生成すると void fanc(IAnimal animal) に入れられなくなります。 どう書けばいいんですか?
- 383 名前:デフォルトの名無しさん mailto:sage [2010/07/17(土) 22:57:19 ]
- >>380
間接参照の概念さえあれば大体何がやりたいのかは分かる
- 384 名前:デフォルトの名無しさん mailto:sage [2010/07/17(土) 23:00:17 ]
- >>382
そのスマートポインタをデリファレンスすれば委員で内科医? 言語が判らんから具体的には答えられないが。
- 385 名前:デフォルトの名無しさん mailto:sage [2010/07/17(土) 23:12:08 ]
- >>382
アセンブラやればわかるようになる
- 386 名前:デフォルトの名無しさん mailto:sage [2010/07/17(土) 23:12:10 ]
- C++(VC10)です
↓こういうふうに書いたら駄目なんですか? 何で入らないのかわかりません std::shared_ptr<IAnimal> dog_ptr(new Dog());
- 387 名前:デフォルトの名無しさん mailto:sage [2010/07/17(土) 23:16:15 ]
- >>386
ポインタを実態を必要とする関数に渡したいなら、>384の言うように逆参照すればいい。 もしかして、単項*演算子も知らないのか?
- 388 名前:デフォルトの名無しさん mailto:sage [2010/07/17(土) 23:18:59 ]
- >>382
auto_ptr<Dog> p(new Dog()); func(*p);
- 389 名前:デフォルトの名無しさん mailto:sage [2010/07/17(土) 23:54:24 ]
- うーん何言ってるかよくわからないのはポインタを避けて通ってるからなのですかね
とりあえず.get()って付けたら入りました func(dog_ptr.get()); 全く意味わからないですが急場しのぎって感じで満足してます やっぱもってるなってことで
- 390 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 00:01:10 ]
- その程度で満足できるんなら勝ちでいいよ
- 391 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 00:37:28 ]
- >>389
メモリの絵を描いて理解するんだ。
- 392 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 00:54:50 ]
- たとえばK&Rは第5章がポインタで第6章が構造体だが
ポインタは避けるが構造体 (クラス) は避けないって感覚は異常だよ ふつうに考えるとポインタよりもクラスのほうが難しいはずだよ なぜか知らないがクラスが難しいと言うのは恥ずかしい ポインタが難しいと言うのは恥ずかしくないという空気に支配されている気がする
- 393 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 02:43:01 ]
- 知らんがな
- 394 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 03:00:05 ]
- 何かあるとK&Rという空気に支配されている気がする
- 395 名前:デフォルトの名無しさん mailto:sage [2010/07/18(日) 03:11:20 ]
- 3連休だしプログラミングの勉強しようぜ
ttp://tsushima.2ch.net/test/read.cgi/news/1279349199/
- 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 ]
- ポインタでひっかかるってよく言うけど、具体的にポインタの何でひっかかるの?
初期化せずに使うミスをするとかそういうこと?
|

|