1 名前:デフォルトの名無しさん [2010/06/30(水) 10:22:47 ] なぜポインタで引っかかる人が多いのか 引っかかる人は何に困惑しているのか
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)
497 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 12:51:59 ] constでない参照の乱用がわかりやすい?どこの初心者だよ。
498 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 13:03:19 ] >>497 それは参照を理解していないだけでしょう?
499 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 13:18:35 ] こんな場所なら初心者でも熟練者でも同じように発言できるからなあ。 どっちが正しいか客観的に判断する方法もないし。 「あんたがわかってないだけでしょ」って言ったもん勝ちか。
500 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 13:44:58 ] ポインタの一次元配列を、二重ポインタって呼ぶんだ へー
501 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 13:51:10 ] まじで? 初めて聞いた。 int **a;これが二重ポインタだと思ってた。
502 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 14:38:44 ] なんか、会社ってところはどこもそうなのかも知れないけどさ 良い人から辞めちゃうよね んでもって、腹黒い人とか、他人を動とも思わない人とか、 図々しい人とか、・・・そんなのばかりがテコでも動かないぜって 感じで居座り続ける・・・ 会社って、こうやってダメになっていくんだと思う それはそのまんま居座り族・牛耳り族が社会をダメにしていくって ことなんだ。。。
503 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 16:49:35 ] 二 重 ポ イ ン タ な ん て 言 葉 は な い
504 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 17:25:28 ] >>499 それもそうですねえ。 ちょうど宿題スレでポインタのポインタを扱う(正確にはポインタのポインタを使いたいところを使ってはいけない状況に縛られる)状況でプログラムを作成したので、 もののついで、1) ポインタのポインタを使うプログラム、2) ポインタの参照を使うプログラム、を実際に書いてみました。 私の感性では、やっぱり参照を使ったほうがわかりやすい、と思うのですが、どうでしょうかね。 出題内容:hibari.2ch.net/test/read.cgi/tech/1280653311/615 ポインタのポインタを使って書いたもの:codepad.org/MpmPDEc3 参照を使ったもの:codepad.org/nHqWWH51
505 名前:499 mailto:sage [2010/08/29(日) 17:52:20 ] >>504 その程度の問題だったらポインタのポインタも、ポインタの参照も使わずに出来るよ。 ポインタだけで出来るから頑張って作ってみ。
506 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 18:00:59 ] >>505 ポインタだけでつくっています。 hibari.2ch.net/test/read.cgi/tech/1280653311/689
507 名前:499 mailto:sage [2010/08/29(日) 18:08:12 ] じゃあ最初からそれ出せばいいじゃん・・・ 何で無駄なポインタのポインタやら、ポインタの参照やら使ったプログラム書くんだか。
508 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 18:19:53 ] >>507 >>506 では、2分木に対するデータの追加を扱っていますが、 ポインタのポインタをつかわなければ、 struct node *root; root = add_node(root, data); という形になり、これでは再帰が深くなると無駄な代入が繰り返されてしまいます。 本当に代入が必要なのはデータの追加が行われたところのノードですから、そのようにコードをかいて、 sturcut node *root; add_node(&root, data) という形にするのが本当だと思います。 参照を使うと、 struct node *root; add_node(root, data) とかけますし、add_node() 自体の記述でも、* や & を省くことができます。 具体的なコードの記述例は >>504 のリンク先を参照してください。
509 名前:499 mailto:sage [2010/08/29(日) 18:27:00 ] >>508 >ポインタのポインタをつかわなければ、 >struct node *root; >root = add_node(root, data); >という形になり、これでは再帰が深くなると無駄な代入が繰り返されてしまいます。 それはロジックが悪い。 そんなに代入を繰り返さなくても出来る。考えてみ。 >参照を使うと、(略)* や & を省くことができます。 参照でコードが短くなるのは当然だが、同時に、「値が変化している」という情報も失われる。 以下のような例がありえる。 struct HOGE* hoge; func1(hoge); func2(hoge); //ここで内容をいじっている! func3(hoge); これは以下のようにしたほうが「中で何かしている」感じがわかりやすくなる。 func1(hoge); func2(&hoge); func3(hoge); 値を変える参照は、短くなるからと無闇に使うと危険ですよ。
510 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 18:31:38 ] >>509 >それはロジックが悪い。 >そんなに代入を繰り返さなくても出来る。考えてみ。 いや、二分木や線形リストに関しては、ポインタのポインタを使わない限り、無駄な代入が繰り返されてしまいます。 ポインタのポインタを使わずにスマートな方法があるというのなら、それは是非知りたいところです。実例を示してください。 >値を変える参照は、短くなるからと無闇に使うと危険ですよ それはそうですね。後から読むときにわかりにくいのは事実です。
511 名前:499 mailto:sage [2010/08/29(日) 18:34:27 ] 「参照を理解してない人」に教えてもらってどうすんだ?あ? 無礼な言葉を吐くだけ吐いて、出来ないとなったら教えてください、かよ。おめでたいガキだな。
512 名前: ◆QZaw55cn4c mailto:sage [2010/08/29(日) 18:41:58 ] >>511 コードを示してください。 私はすでにポインタのポインタを使ったもの、参照をつかったもの、ポインタのポインタを使っていないものの3種を示しています。 時間はたっぷりありますから、アイディアだけでも示してください。 話はそれから。
513 名前:499 mailto:sage [2010/08/29(日) 18:43:48 ] バカバカしい。 無礼者に使う時間などないよ。 おまえよりもうちょっとマシな誰かが、気が向いたらコード書いてくれるかもしれないから、それまで待ってれば?
514 名前: ◆QZaw55cn4c mailto:sage [2010/08/29(日) 18:47:43 ] >>513 よく検討もせずに >それはロジックが悪い。 というほうがよっぽど無礼ですね。こちらは動くコードを書いた上で意見を述べているのですけれども。 コードを示してください。 話はそれから。
515 名前:499 mailto:sage [2010/08/29(日) 18:50:23 ] そこのロジックの悪さはきちんと検討して発言してるよ。 代替コードも書いている。 おまえにタダで見せる気にならないだけだ。 誰か奇特な人が見せてくれるまで口あけて待っとけ。
516 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 20:34:55 ] >>515 何か既視感があるな・・・
517 名前: ◆QZaw55cn4c mailto:sage [2010/08/29(日) 20:34:56 ] >>515 口だけなら「コードを書いている」といくらでもいえます。 それに「見せるきにならない」といいますが、 仮に見せていただければ、私はただただ低頭して「私が馬鹿でした」と発言して消えるでしょう。 それはあなたにとっては、大満足なのではないですか 動くコードを見せて実証することで、私の今までの発言を全否定できるにもかかわらず、それをせずにうそぶくのみ。 これでは、実証するアイディアなりコードなりがないと推測せざるをえません。推測ですけれどもね。 コードを示してください。 話はそれから。
518 名前:499 mailto:sage [2010/08/29(日) 20:38:25 ] >>517 おまえが馬鹿(というよりは、低レベル)なことは、俺にとってははっきりしてるからな。 別にこんな便所のラクガキの場所で示す必要も無い。 逆に、示してやればおまえのレベルを引き上げてしまう。バカバカしい。 ど素人はど素人のまま、学生の宿題でもやってるのがお似合いだよ。 だいたい、教えて欲しいなら、最初の暴言を謝るのが順序だろう。それもせずにただ出せなんて図々しい。
519 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 20:41:44 ] ポインタのポインタなんて、Win32のCOMみたいな使い方をする程度かな ふつーに struct data *alloc_root(void); int add_data(struct data *root, char *name, char *tel); とか作る
520 名前: ◆QZaw55cn4c mailto:sage [2010/08/29(日) 21:22:48 ] >>518 ひとつ可能性があるとすれば、非再帰的に記述することですかね。 線形リストならば、それは可能ですが、2分木だと結構むずかしくなります。たぶん各ノードにワークエリアを設けて 戻るノードを記憶しなければならないでしょうね。 昔書いた非再帰的なコードをあげておきます。ポインタのポインタは使っていますが。 codepad.org/n3raxalm 私は再帰的なアルゴリズムのみしか念頭にありませんでした。 もし非再帰的に記述することを示唆しておれば、大変失礼いたしまた。
521 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 21:27:33 ] binary treeで戻る?
522 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 21:31:53 ] >>521 ええ、binary tree でノードの追加なり総なめを行うのなら、親ノードの位置を逐一記録しておかなければならないでしょうね。 ノードを追加したら、追加されて新しく親ノードになったところをなんらかの形で覚えておかないといけないでしょう。 もしかすると、ノードごとにワークを持つ必要はないかもしれませんが。(>>520 はノードごとにワークをもっていました。)
523 名前:デフォルトの名無しさん mailto:sage [2010/09/01(水) 22:08:27 ] 親ノードとかいらねーよアホ バイナリツリーでそんな実装するわけねーだろ
524 名前:デフォルトの名無しさん mailto:sage [2010/09/01(水) 23:05:14 ] たしかに非再帰に書くのなら、いらないみたいですね。 hibari.2ch.net/test/read.cgi/tech/1280653311/735
525 名前:デフォルトの名無しさん mailto:sage [2010/09/04(土) 03:15:33 ] char *name[]ってどういう意味なんでしょうか?
526 名前:デフォルトの名無しさん mailto:sage [2010/09/04(土) 07:12:23 ] char **name;
527 名前:デフォルトの名無しさん mailto:sage [2010/09/04(土) 10:47:37 ] >>526 ありがとう!
528 名前:デフォルトの名無しさん mailto:sage [2010/09/04(土) 15:28:58 ] えっ
529 名前:デフォルトの名無しさん mailto:sage [2010/09/10(金) 19:18:42 ] アセンブラでメモリの番地は理解していても C言語での書き方で悩む事もあるんだよ >>55 みたいな
530 名前:デフォルトの名無しさん mailto:sage [2010/09/10(金) 19:19:32 ] constの位置とかもな
531 名前:デフォルトの名無しさん mailto:sage [2010/09/10(金) 19:53:48 ] 面倒なので括弧を付ける
532 名前:デフォルトの名無しさん mailto:sage [2010/09/10(金) 23:54:01 ] >>530 const は一番近い場所にある token が変更不可能になる っていう理解で桶?
533 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 00:09:14 ] int const * 近いってどっちだよ、ってなるぞ
534 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 17:57:59 ] 暗記したほうがマシ、というか十分。 理屈を抜きにするから応用利かないけど。 この二つ暗記な。 int *p[] ポインタの配列 int *const p コンストポインタ だからこそ、 配列のポインタが (*p)[] だと想像できるし、 コンストintへのポインタが int const *だと分かる。
535 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 18:44:36 ] そんなにむずかしくないだろ constが後置修飾になってるほうがポインタそのものをconstにしてるだけ int const もconst int も int を定数にしてるだけなんだし
536 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 20:25:13 ] いや いまは int const * p; と int * const p; の違いの話をしているんじゃまいか
537 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 20:41:58 ] イメージ的には、 ポインタの配列は(*p)[] これだし、 constポインタはconst (int *)pこう書きたい。 イメージどおりには行かんね。
538 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 20:52:42 ] >ポインタの配列は(*p)[] これだし、 hds
539 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 21:44:43 ] const int *p
540 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 21:54:39 ] const int *p; int const *p; int * const p;
541 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 22:22:42 ] de?
542 名前:デフォルトの名無しさん mailto:sage [2010/09/12(日) 16:15:02 ] 掛け算以外のアスタリスクがあまり出てこないプログラムを心がけてますよ
543 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 18:36:27 ] >>542 それは C の最強の武器を放棄したに等しい。
544 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 19:10:55 ] >>540 kwsk
545 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:12:37 ] const int *p => const int の ポインタ int const *p => const int の ポインタ int * const p => int の const ポインタ
546 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:19:34 ] 1行目と2行目の違いが判らんのだが
547 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:24:15 ] 違いはない
548 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:29:20 ] えっ
549 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:36:05 ] int main() { int i = 100, j = 200; const int *a, *b; // const int int const *c, *d; // const int int *const e = &i, *const f = &i; // intへのconstポインタ int const *const g = &i, *const h = &i; // const intへのconstポインタ *a = j; // error: assignment of read-only location *b = j; // error: assignment of read-only location *c = j; // error: assignment of read-only location *d = j; // error: assignment of read-only location e = &j; // error: assignment of read-only variable `e' f = &j; // error: assignment of read-only variable `f' *g = j; // error: assignment of read-only location *h = j; // error: assignment of read-only location g = &j; // error: assignment of read-only variable `g' h = &j; // error: assignment of read-only variable `h' return 0; }
550 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:38:02 ] ちょい修正: const int *a, *b; // const intへのポインタ int const *c, *d; // const intへのポインタ
551 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:51:05 ] えっえっ
552 名前:デフォルトの名無しさん mailto:sage [2010/09/14(火) 08:42:30 ] * の左側に const があるか右側にあるかだけですべてが決まるんだよ * が複数ある場合も何番目の * と * の間に const があるかで意味が決まる
553 名前:デフォルトの名無しさん mailto:sage [2010/09/14(火) 17:48:16 ] 難しいのー
554 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 00:05:24 ] far * near * とかに比べると、ああらくちんだ〜。
555 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 00:11:29 ] >>522 巡回するなら普通はスタック使うだろ? ってマジレスしたらいかんかったのだろうか >>523 仕様によってはあり得る
556 名前:522 mailto:sage [2010/09/15(水) 00:28:58 ] >>555 この問題、宿題スレの方で実際にコードを書いていただき、戻る位置をおぼえない方法を示していただきました。 すぱっと非再帰に書き下すきれいなコードでした。>>524 でも、二分木は再帰で書きたいもの、とちょっと負け惜しみ。
557 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 00:46:28 ] スタティックな変数を使えば再帰でも書ける 最適化を考えると大概再帰よりループ展開の方が速い どっちでも書けるようになったほうがいいぞ
558 名前:522 mailto:sage [2010/09/15(水) 00:50:29 ] >>557 それもそうですね。精進します。
559 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 13:06:41 ] だから言ったじゃねえかよ。 あと、再帰でも、無駄なコピーなしに実装できる。 絶対できないとか頑張ってないで、ちょっと考えてみ。
560 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 13:48:49 ] 学生だと思うけど若い割に頭硬そうだよな アルゴリズム関係は向いてないんじゃないかね
561 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 18:12:27 ] >>559 二重ポインタか参照を使わないと無理ではないでしょうか?
562 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 19:54:07 ] 出来るって言ってんのにわからんガキだな〜 人を疑う前に少しは考えろよ
563 名前:デフォルトの名無しさん mailto:sage [2010/09/20(月) 13:34:24 ] >>552 嘘書くなよ
564 名前:デフォルトの名無しさん mailto:sage [2010/09/21(火) 07:13:43 ] 嘘ってこともないだろ。判り難い説明ではあるが。
565 名前:デフォルトの名無しさん mailto:sage [2010/09/27(月) 23:59:03 ] 面倒だから型の左側以外に const 使うなよ。 const int* a とかにしとけ。 int const *aとか使わんだろ。
566 名前:デフォルトの名無しさん mailto:sage [2010/09/28(火) 00:29:20 ] int * const a
567 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 17:10:52 ] const int const *a;
568 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 17:52:31 ] >>567 勉強しなおそうね
569 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 17:58:19 ] >>567 int const * const a; or const int * const a;
570 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 18:31:19 ] >>569 上と下はどうちがうの?
571 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 18:57:08 ] >>570 かわらない。
572 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 19:17:28 ] えっ
573 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 19:22:55 ] >568 修飾子が被っているが無視されるので問題ない まぁ、書いた人はそんなこと意図していなかっただろうけど
574 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 19:25:25 ] >>571 どっちが正しいっていうか一般的っていうか
575 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 20:27:37 ] どっちも正しい
576 名前:デフォルトの名無しさん mailto:sage [2010/10/24(日) 18:26:18 ] const int const * const a;
577 名前:デフォルトの名無しさん mailto:sage [2010/10/24(日) 19:10:29 ] だから被ってるって、まぁいいけどね