- 1 名前:デフォルトの名無しさん [2010/06/30(水) 10:22:47 ]
- なぜポインタで引っかかる人が多いのか
引っかかる人は何に困惑しているのか
- 577 名前:デフォルトの名無しさん mailto:sage [2010/10/24(日) 19:10:29 ]
- だから被ってるって、まぁいいけどね
- 578 名前:デフォルトの名無しさん mailto:sage [2011/02/06(日) 02:34:02 ]
- ひっかけ問題みたいだから。
- 579 名前:デフォルトの名無しさん [2011/02/06(日) 10:06:34 ]
- >>573
被ってはいないだろ
- 580 名前:デフォルトの名無しさん mailto:sage [2011/02/06(日) 10:48:42 ]
- >>579
○ const int ○ int const × const int const ○ const int * const ○ int const * const × const int const * const ○ const int * ○ inst const * × const int const * ○ int * const ○ int *
- 581 名前:デフォルトの名無しさん mailto:sage [2011/02/06(日) 11:55:22 ]
- >>580
> ○ const int * > × inst const * ○ int const * inst になってしまそうになる気持はわかる
- 582 名前:デフォルトの名無しさん mailto:sage [2011/02/06(日) 16:59:24 ]
- int const C::* p; // Cはクラス型
C* c; c->*p;
- 583 名前:デフォルトの名無しさん mailto:sage [2011/02/07(月) 11:33:10 ]
- 我々のポインタ。いやらしい・・・
- 584 名前:デフォルトの名無しさん mailto:sage [2011/02/21(月) 22:33:30.98 ]
- ぬるぽ
- 585 名前:デフォルトの名無しさん mailto:sage [2011/02/27(日) 00:22:54.55 ]
- int const * const ** const *p;
コンストintへのポインタへのコンストポインタへのポインタへのコンストポインタでOK?
- 586 名前:デフォルトの名無しさん mailto:sage [2011/02/27(日) 00:29:38.88 ]
- 間違ってるぞ
- 587 名前:デフォルトの名無しさん mailto:sage [2011/02/27(日) 01:21:24.77 ]
- 指定子に対する const 以外はすべて後方から修飾。
(指定子に限りどちらからでも修飾可能) マンバポインタといっしょで *const で一塊と見たほうがわかりやすいね。 int *p; int ( *func )(); int *const q = p; int ( *const funk )() = func; class C; int C::* r; int ( C::* funx )();
- 588 名前:デフォルトの名無しさん mailto:sage [2011/02/27(日) 21:17:19.78 ]
- う〜、マンバ!!
- 589 名前:デフォルトの名無しさん mailto:sage [2011/03/04(金) 21:22:36.79 ]
- char *abc[][3] = {
{"xyz", "uvw", "rst"}, {"opq", "lmn", "ijk"}, {"fgh", "cde", "@ab"}, {"aho", "baka", "shine"} }; で初期化出来ますが、 *abc[][3] の配列(というか *abc[][3] を指すポインタ)は、 char **xyz[][3] = {abc, def, ...}; じゃ代入出来ないんですけど、 どう書いたら良いでしょうか?
- 590 名前:デフォルトの名無しさん mailto:sage [2011/03/05(土) 00:30:23.52 ]
- *[][3]のポインタは、*(*[][3])ね
*abc[][3]に対して、abcは*(*)[3]ね &abcは、*(*)[][3]ね char *(*xyz)[3] = abc; {abc, def, ...}は、配列とかにしたいんだろうから char *(*xyz[])[3] = {abc, def, ...}; 配列にしたいので、xyz[]になる
- 591 名前:デフォルトの名無しさん mailto:sage [2011/03/05(土) 00:43:58.31 ]
- ありがとうございます
char *(*xyz[])[3] = {abc, def, ...}; ならいけますが char *(*xyz[])[3] = { { {"xyz", "uvw", "rst"}, {"opq", "lmn", "ijk"}, {"fgh", "cde", "@ab"}, {"aho", "baka", "shine"} }, { {"xyz", "uvw", "rst"}, {"opq", "lmn", "ijk"}, {"fgh", "cde", "@ab"}, {"aho", "baka", "shine"} }, { {"xyz", "uvw", "rst"}, {"opq", "lmn", "ijk"}, {"fgh", "cde", "@ab"}, {"aho", "baka", "shine"} }, ... }; は無理ですよね?
- 592 名前:デフォルトの名無しさん mailto:sage [2011/03/05(土) 00:52:24.23 ]
- char *xyz[][4][3] = {略};
{"xyz", "uvw", "rst"}, {"opq", "lmn", "ijk"}, {"fgh", "cde", "@ab"}, {"aho", "baka", "shine"} } が[4][3] ""が* その配列なので、[] char *(xyz[])[4][3]の方がわかりやすいかな
- 593 名前:デフォルトの名無しさん mailto:sage [2011/03/05(土) 06:04:54.10 ]
- あ、説明不足でした。すみません。
char *abc[][3] = { {"xyz", "uvw", "rst"}, {"opq", "lmn", "ijk"}, {"fgh", "cde", "@ab"}, {"aho", "baka", "shine"} ... ... ... }; なら縦方向に可変長に出来るのに、 char *(*xyz[])[3] = { { {"xyz", "uvw", "rst"}, {"opq", "lmn", "ijk"}, {"fgh", "cde", "@ab"}, {"aho", "baka", "shine"} }, { {"xyz", "uvw", "rst"}, {"opq", "lmn", "ijk"} }, { {"xyz", "uvw", "rst"}, {"opq", "lmn", "ijk"}, {"aho", "baka", "shine"} }, ... ... }; は無理ですよね? ってことです。
- 594 名前:デフォルトの名無しさん [2011/03/05(土) 06:14:40.27 ]
- 馬鹿には無理
- 595 名前:デフォルトの名無しさん [2011/04/11(月) 21:47:20.95 ]
- 馬鹿ばっかだな。
**、が何示してるか分からないだろ。
- 596 名前:デフォルトの名無しさん mailto:sage [2011/04/12(火) 22:33:04.77 ]
- >>593
二次元配列へのポインタを[]を使わないで書けるようにまずはなれ
- 597 名前:デフォルトの名無しさん mailto:sage [2011/04/15(金) 01:00:43.52 ]
- >>71
> ">私のささやかな経験から言わせてもらうと、伝統的に大学のコンピュータ > サイエンスのカリキュラムで教えられているもので、多くの人がうまく理解 > できないものが2つあった: ポインタと再帰だ。 > " なんか再帰が苦手だったというか、最初ハノイの塔とかでも自分で自分を呼ぶというのが どうもよくわからなくて苦労したが、同じ名前の関数を呼ぶと考えたらあっさり理解できたな 初心者の頃。 でもトレースするのはやっぱり苦手。
- 598 名前:デフォルトの名無しさん mailto:sage [2011/04/15(金) 12:01:39.81 ]
- >>597
自分で自分を呼ぶと考えるからややこしいんだよ。 例えば階乗なんてこれだけだ。 自然数nの階乗とは: nが0か1の場合、1 そうでない場合、n-1の階乗にnをかけた結果 これをCでそのまま書くだけ。 unsigned factrial(unsigned n) { if (n == 0 || n == 1) return 1; return factrial(n - 1) * n; } ハノイの塔だろうがフィボナッチ数列だろうがツリー探索だろうがみんなこれの応用だ。 なんなら解説してもいいけど、ここではスレ違いだな。
- 599 名前:デフォルトの名無しさん mailto:sage [2011/04/15(金) 12:18:02.65 ]
- すみません
末尾再帰は単純なループに置き換え可能だそうですが >>598 はどうなりますか?
- 600 名前:デフォルトの名無しさん mailto:sage [2011/04/15(金) 13:00:03.37 ]
- >>599
考え方をちょっと変える必要がある。 >自然数nの階乗とは: >nが0か1の場合、1 >そうでない場合、n-1の階乗にnをかけた結果 ここで、n-1の階乗を返す関数の代わりにn-1の階乗にnをかけた結果を返す関数を用意する。 unsigned fact_sub(unsigned n, unsigned r) { if (n == 0 || n == 1) return r; // 0! * r or 1! * r return fact_sub(n - 1, n * r); // (n-1)! * r } これを呼ぶように>598を書き換える。 unsigned factrial(unsigned n) { return fact_sub(n, 1); } C++なら、unsigned factrial(unsigned n, unsigned r = 1)としてしまえば一関数で済む。 尤も、こんなことするまでもなく最近のgccは>598をループに書き換えるけどね。
- 601 名前:デフォルトの名無しさん mailto:sage [2011/04/17(日) 06:21:40.62 ]
- 再帰は自分自身を呼び出したとき、関数の最初に戻るのではなく
呼び出したところに関数と同じ内容のブロックがあり、 それが延々と続いてるとイメージすれば分かりやすい それはまさにツリーと同じ構造だ
- 602 名前:デフォルトの名無しさん mailto:sage [2011/04/17(日) 06:44:15.01 ]
- なるほど、そういう馬鹿げた置き換えイメージを持っているから、実際に
再帰で書けと言っても書けない奴が多いのか、再帰のロジックを読める くせに書けない奴が多い理由がわかった。
- 603 名前:デフォルトの名無しさん mailto:sage [2011/04/17(日) 09:02:18.74 ]
- そういう書けない人には
「まずuntilループに書き換える」 「ループ内で再代入する変数は全て引数として渡す」 って2点を教えてやれ
- 604 名前:デフォルトの名無しさん mailto:sage [2011/04/17(日) 09:04:11.42 ]
- またいつもの再帰番長か。
- 605 名前:デフォルトの名無しさん mailto:sage [2011/04/17(日) 09:11:00.70 ]
- アセンブラやらないからだよ
- 606 名前:デフォルトの名無しさん mailto:sage [2011/04/17(日) 21:34:44.55 ]
- 末尾最適化が出来る再帰と出来ない再帰があるな
例えばアッカーマン関数は末尾最適化出来ない
- 607 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 01:21:52.48 ]
-
ttp://kmaebashi.com/programmer/pointer.html >K&Rによれば、Cの宣言は、「変数が現われ得る式の構文を真似た(P.114)」そうである。 >しかし、本質的に全く異なるものを無理に似せようとしたため、 >結局わけのわからない構文になってしまっている。 ># Cの作者Dennis Ritchieが最近開発した新しい言語 Limboは、一見 ># C like だが、宣言の構文はしっかりPascal風のものに直してある... ># ずるい(^^;
- 608 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 01:46:12.61 ]
- 変数宣言の*と、デリファレンスの*で混乱したのを思い出すわ。
同じ*だと思っていたからどうにも理解できなかったわ。
- 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 ]
- リンクドリストは要素の数だけメモリがあるのか。大変だな。
|

|