- 1 名前:デフォルトの名無しさん [2007/10/24(水) 04:07:56 ]
- なんと!意外にもスレが無かったので立ててみました
先日のソフトウェア開発技術者試験午後UのB木のポインタ表現 近年の基本情報技術者試験の午後C言語問題の自己参照構造体 など物凄く出来が悪いです。 ゆとり?文系?自作減少? ブラックボックス化されてメモリ管理やコンピュータの細かい知識が不要となった? 本当にポインターは必要なのか!?議論しましょう
- 403 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 18:16:53 ]
- 宣言に問題あるよな、
最初からそういうもんだと思ってたからあまり考えなかったけど。 int *p, *q; じゃなくて *int p, q; にすりゃいいんだ。
- 404 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 18:18:20 ]
- pointer<int> p;
こうだろ
- 405 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 18:48:11 ]
- >>403
その記法で関数ポインタとポインタを返す関数をどうやって区別する?
- 406 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 19:31:17 ]
- >>404
実際、C++だとstd::tr1::add_pointer<int>::typeとか boost::mpl::identity<int*>::typeとか書ける。 ::typeとか冗長だけどうまく使えば便利に思うこともある。
- 407 名前:デフォルトの名無しさん [2007/11/13(火) 21:39:21 ]
- const int a = 1;
int* p = &a; ってしたら、*pでaの値を変更できる? *&a ってした場合は、どう?
- 408 名前:デフォルトの名無しさん [2007/11/13(火) 21:49:06 ]
- すいません、上を少し訂正します
const int a = 1; const int* p = &a; ってしたら、*pでaの値を変更できる? *&a ってした場合は、どう?
- 409 名前:デフォルトの名無しさん [2007/11/13(火) 22:10:44 ]
- つ const_cast
- 410 名前:デフォルトの名無しさん [2007/11/14(水) 05:54:34 ]
- >>408
#include <stdio.h> int main(int argc, char** argv) //char *argv[] { const int a = 1; const int* p = &a; printf("a=%d *p=%d\n&a=%p p=%d\n", a, *p, &a, p); return 0; } FreeBSDでの結果 a=1 *p=1 &a=0xbfbff8fc p=-1077937924
- 411 名前:デフォルトの名無しさん [2007/11/14(水) 05:56:03 ]
- さらに
#include <stdio.h> int main(int argc, char** argv) //char *argv[] { const int a = 1; const int* p = &a; printf("a=%d *p=%d\n&a=%p p=%d\n", a, *p, &a, p); *p = 5; a = 9; printf("a=%d *p=%d\n&a=%p p=%d\n", a, *p, &a, p); return 0; } コンパイルエラー ×2ケ所
- 412 名前:デフォルトの名無しさん [2007/11/14(水) 05:57:54 ]
- あ、>>410は間違った
最後は%dじゃなくて%p printf("a=%d *p=%d\n&a=%p p=%p\n", a, *p, &a, p); FreeBSDでの結果 a=1 *p=1 &a=0xbfbff8fc p=0xbfbff8fc
- 413 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 09:13:50 ]
- >>410
あ、何となくわかってきた。 タイプ ア ド データ レ ス アドレス*タイプでデータを指し示すから、*pで、データをアドレス&タイプに変換するから、 &aなんだな。
- 414 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 09:17:24 ]
- 413が何を言ってるのかわからんのだが
- 415 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 09:21:59 ]
- >>414
「*」や「&」という変な文字を使う理由について推測しただけ。
- 416 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 09:45:47 ]
- &は変数のアドレスを得る演算子
*はポインタの先にある実体を得る演算子 p = &a; は変数aのアドレスをポインタpに代入。 *p = 5; はpに入っているアドレスの先を書き換える処理 というのは理解してるのかな?
- 417 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 13:08:50 ]
- ポインタ変数を使うからよく分からなくなるのではないか?
longかなんかの変数にポインタを代入して、いろいろやってたら何となく分かって来るよ。きっと。 環境依存だけど。
- 418 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 13:47:37 ]
- なぜわざわざ・・・
- 419 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 17:34:00 ]
- それやるくらいだったら、
アセンブリ言語使ってみろというほうがずっと有意義。
- 420 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 17:39:28 ]
- よくアセンブリ言語薦めるやついるけど、
JavaとかC#とかの高級言語触らせたほうが、どうしてポインタが欲しくなるのかを理解するのにはいいんじゃないか?
- 421 名前:デフォルトの名無しさん [2007/11/14(水) 18:00:35 ]
- >>420
JavaとかC#だって、ポインタはあるのだから、欲しくなんてならない。
- 422 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:01:06 ]
- アセンブラなんてしなくてもC++とXbyakで遊べばいいんだよ
- 423 名前:デフォルトの名無しさん [2007/11/14(水) 18:02:49 ]
- ポインタや再帰を駆使したアルゴリズムの本ない?
- 424 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:03:53 ]
- Javaにもポインタってあるんですか?
- 425 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:06:45 ]
- >>421
ちげーよ、安全に使えるようになってるから理解しやすいかと思ったんだよ。
- 426 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:06:59 ]
- ポインタと再帰はあんまり関係なくね?
- 427 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:07:34 ]
- >>424
ヒント:ぬるぽ
- 428 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:08:29 ]
- >>424
ポインタは無いよ
- 429 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:11:19 ]
- >>420
アセンブラは良く知らんが同意 >>421 趣味でちょっとしたTCP/IPプロトコルを実装しているんだが ポインタがないと俺には無理ってぐらいだ こんなものをC#とかJavaとか他の言語でどうやって書けと(ry ポインタとmemcpyを使ってソース書くときれいになって読みやすくなってるぞ
- 430 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:13:31 ]
- C#にポインタはあるよ
- 431 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:15:32 ]
- C脳から抜け出せてないのやら他言語に疎いのやら
- 432 名前:429 mailto:sage [2007/11/14(水) 18:15:35 ]
- >>430
あれは紛い物
- 433 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:22:26 ]
- どういう点が?
- 434 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:23:12 ]
- ポインタだけに点
- 435 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:29:18 ]
- これはいい脱力感
- 436 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:37:23 ]
- わふ?
- 437 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:10:45 ]
- >>432
結局根拠無し?
- 438 名前: mailto:sage [2007/11/16(金) 00:10:00 ]
- アセンブラ役にたたんかもしれんが
理解を深めるには結局は近道だと思われ
- 439 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 07:30:47 ]
- ポインタの理解には、メモリとアドレスについて知れば十分。
インストラクションコードの知識が必要になるのは、もっとずっと後。
- 440 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 08:37:13 ]
- 絶対アドレッシングと相対アドレッシングまで押さえれば完璧
- 441 名前:デフォルトの名無しさん [2007/11/16(金) 09:11:57 ]
- //
- 442 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:44:40 ]
- い・・・いんす・・・とらく・・・?
- 443 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 02:40:14 ]
- たー・・・のお・・・ね・・・えちゃん・・・?
- 444 名前:デフォルトの名無しさん [2007/11/17(土) 06:48:29 ]
- ハンドアセンブルで COM ファイルを書いてみる。
- 445 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 07:24:47 ]
- ORG 100
- 446 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 07:32:12 ]
- ハンドアセンブルが許されるのはZ80までだよねー(AA略
- 447 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 10:52:54 ]
- 全てのものはメモリ上においてあって、位置はアドレスで示せて、ポインタはアドレスを入れる変数、
でいいんじゃね?
- 448 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 12:01:50 ]
- ポインタの「型」を忘れるなと何度言ったr
- 449 名前:デフォルトの名無しさん [2007/11/18(日) 12:56:38 ]
- ?
- 450 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 14:15:25 ]
- エスパーのおれが解説を試みてみる
char *cp; int *ip; /* いろいろやる */ cp++; ip++; の最後の2行の挙動が>>447には含まれてないってことじゃね?
- 451 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 14:37:46 ]
- なるほど。ご指摘&解析ありがとう。
では447の補足。 ポインタには加算減算が定義されている。加算結果のアドレスがいくつ増えるかはポインタの型に依存する。 intが4バイトの処理系でintのポインタに+1するとアドレスは4バイト移動する。 これはメモリ上の連続領域にかかれたintデータにアクセスする際に便利。 ぜんぜんわかりやすくないな。サーセン。
- 452 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 14:39:50 ]
- なるほど。ご指摘&解析ありがとう。
では447の補足。 ポインタには加算減算が定義されている。加算結果のアドレスがいくつ増えるかはポインタの型に依存する。 intが4バイトの処理系でintのポインタに+1するとアドレスは4バイト移動する。 これはメモリ上の連続領域にかかれたintデータにアクセスする際に便利。 ぜんぜんわかりやすくないな。サーセン。
- 453 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 14:40:05 ]
- 加算減算に触れるのには相対アドレス絶対アドレスみたいなのも理解が必要だと思うけど
こういう仕様が表に出ている事のメリットがいまひとつわからない
- 454 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 15:10:32 ]
- >>447
厳密に言うとメモリ上にない変数もあるのだ、ふっふっふ。
- 455 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 15:25:00 ]
- レジスタ上ってこと? 確かに忘れてた。ご指摘感謝。
まぁポインタの話をするときはメモリ上って事でいいのでは?
- 456 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 15:26:36 ]
- いまレジスタってあるの?
- 457 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 16:12:24 ]
- あるよ、何言ってるんだ?
- 458 名前:デフォルトの名無しさん [2007/11/18(日) 16:28:51 ]
- 全然意識したことないや
- 459 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 16:34:56 ]
- じゃあ
register int i; &i; ってやってみるといいよ。コンパイラに怒られるから。
- 460 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 16:50:18 ]
- C言語に register はあるけど、どう扱うかはコンパイラ任せ
じゃない?実際任せるしか無いと思うけど。多少配慮は してくれるはずだが、下手するとかえって遅くなる場合もある。 CPU 上の話はまたそれはそれで違うよね。
- 461 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 17:48:35 ]
- レジスタ増えすぎだし人間が管理するより任せた方がいいわな
高級言語でわざわざ意識する機会なんてまず無いわ
- 462 名前:デフォルトの名無しさん [2007/11/18(日) 17:50:14 ]
- registerなんてもう10年位使ってない
- 463 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:26:58 ]
- ま、今時register修飾なんか無視するコンパイラがほとんどだよね。
ただしアドレスだけは取れないようになっている。
- 464 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 21:02:19 ]
- そういえば俺も 10 年以上前にどの変数を register 宣言すると速くなるか、
とか一所懸命自分のコードで調べてた覚えがあるな。けどもうずっと使って なくてコンパイラ任せ。
- 465 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 16:08:13 ]
- registerを使わなきゃならんような場面、今後はもうないだろうね。
少ない資源で必死に高速化してた頃が懐かしす。
- 466 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 17:48:31 ]
- 組み込み系ではまだ、たまに使う場面あるけどね。
- 467 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 15:31:11 ]
- regster使うくらいだったら、自分がアセンブリ言語で書いたほうがいいと考えてしまう。
- 468 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 16:32:17 ]
- &使わないループ変数には付けときゃいいんだよ。
レジスタが空いてないなら勝手に使われないだけなんだから。
- 469 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 16:41:02 ]
- そういうど素人なコードは書きたくないなあ。
組み込み系だったらつけるのはわかるけど、 それ以外だったら間抜け以外の何物でもない。 下手したらオプティマイザーを混乱させてかえって遅くなることもあるし。 つっても今の処理系だったらみんな無視するだろうから大丈夫とは思うけど。 なので場所を弁えずregister修飾入れているやつはど素人。
- 470 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 16:44:13 ]
- >>468
逆!逆!よっぽどの理由がない限りつけないのが普通だってば
- 471 名前:デフォルトの名無しさん [2007/11/21(水) 18:50:12 ]
- アドレスを取られたく無い時ぐらいしか思い付かん
- 472 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 19:08:20 ]
- アドレスを取られたくない時ってのが思いつかん
- 473 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 19:39:28 ]
- gnuのソースなんか付けまくりだぜ
- 474 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 20:23:13 ]
- 太古のソースを後生大事に保持してるからねえ
- 475 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:12:01 ]
- 今時のコンパイラなら謹んで無視するだろ。
- 476 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:21:49 ]
- C++ならregister変数でもアドレス演算子が使えた気がする。
- 477 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:45:17 ]
- 最適化なんてコンパイラにやらせときゃいいのさ。
いろんな環境に移植するソースで、いちいちregister付けたり 外したりなんて馬鹿らしくてできん。
- 478 名前:デフォルトの名無しさん [2007/11/25(日) 13:08:45 ]
- Cでヌルポが(void *)0ってマクロ定義される理由が分からん。
C++では、「ヌルポを(void *)0って定義してはダメ」って記述されてる 本があるけど、その理由も分からん。 結局、ヌルポは、どう理解しておいたらいいのだ? Cでは、ヌルポの型は、(void *)なの? C++では、ヌルポの型は、なんだ?
- 479 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 13:24:31 ]
- C++の本の方は(void *)型の話じゃなくて
0がダメって言ってるだけじゃないの? C自体も0とは定義してないはず 型は・・・どうなんだろう 強いて言えばvoid *型な気がするけど
- 480 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 13:50:17 ]
- NULLは0じゃない。0がNULLなんだ。
この法則に則って考えれば、NULLはCでもC++でも0と定義されるべきであり、それ自体は8進定数と言うことになる。
- 481 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 13:55:36 ]
- >>478の論点は「型は、なんだ?」だと思うが・・・
ちなみになんで8進?
- 482 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:14:33 ]
- ポインタくらい簡単なものが一般的に「ポインタが難しい」とされてるおかげで、C始めたばっかの人が「ポインタが理解できません」と言ってくれるので(難しいとされているので躊躇せずに言いやすい?)面接のときのモグリ排除に大いに役に立っている。
- 483 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:16:21 ]
- それを考えて新人に特別な扱いせずに
普通に変わった変数としてポインタ教えてたら やっぱり2年目になっても分かってなかった
- 484 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:16:55 ]
- 0で始まるから8進数。
- 485 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:17:15 ]
- ポインタって精々理系にとっての微分積分程度のレベルでしょ
- 486 名前:デフォルトの名無しさん [2007/11/25(日) 14:21:10 ]
- 16進は0から始まりませんか?
- 487 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:22:53 ]
- >>485
いや、分数の割り算程度でしょ
- 488 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:24:09 ]
- 微積分マスターよりポインタマスターの方が数段楽。覚えなきゃいけない事項の絶対量が少なすぎる。
- 489 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:27:41 ]
- ポインタって何を覚えるんだ・・・
- 490 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:31:09 ]
- ポインタ(の存在意義)がわかりませんって面接で言ったらなにがわからないのか聞いてくるから
とくとくと語ってみたら面接官涙目になってた。
- 491 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:32:16 ]
- 面接官って技術者の人やってんのかー
ウチの会社は総務だか人事だかがやってたなぁ・・・
- 492 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:44:45 ]
- ポインタがわからないって、ものごとの裏側(仕組み)が
どうなってるのか少しも考えてこなかった証拠じゃね? コンピュータの中で関数がどうやって呼び出されてるのとか、 変数はどうやってわたされてるのとか、 時計の針はどうやってまわるのとか、 えんぴつとか棒付きアイスはどうやってつくるのとか 普通は自分なりに考えてみるものじゃん
- 493 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:46:38 ]
- 赤ちゃんはどうやっ(ry
- 494 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:57:32 ]
- >>492
そうやって裏側の裏側の裏側の……って調べていくとキリがないので、 あるところで計算を打ち切ってcall-by-needで遅延的な思考をすることだってあろう。 そのためにいろんな学問やら処理系やらは多層構造になってるし、 インターフェースが決まってれば実装が見えなくたってかまわないんでしょうよ。 コンピュータをやるなら最低でもアセンブラとかマシン語が云々、とかいう人はそこが分かってない。
- 495 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 15:03:53 ]
- このスレポインタスレだからしょうがないかと思っていた
- 496 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 15:19:54 ]
- アセンブラ出身の俺からみてポインタはなんであんな面倒な仕組みなのか理解できないよ。
- 497 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 15:21:36 ]
- おっちゃん乙
- 498 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 15:26:45 ]
- >>494
違うんだ 具体的な仕組みを正確につきとめるというより 少なくとも自分のなかでつじつまが合うように モノゴトの裏側を想像するってこと 抽象化して考えることが出来る奴は、少なくとも 具体の一例を想像して挙げてみることができると思う
- 499 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 15:38:00 ]
- 合理的に考えられる奴ならポインタのおかしさ、不自然さに気づくだろうよ
- 500 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 15:39:28 ]
- >>478
ぬるぽは、あらゆるポインタ型について存在する。 int*のぬるぽ、void*のぬるぽ、char*のぬるぽ、void(Foo::*)(void)のぬるぽ・・・ 定数「0」は任意の型のぬるぽに暗黙に変換できるので、NULLマクロを0と定義しているのは妥当。 単なる0でなく(void*)0と定義してる場合もあるが、その理由は、単なる0は整数型にもなるので、 char c = NULL; と書くバカがしばしば現れるため。 (void*)0は整数型としては通らないので、これで一応そういうバカを少しは防げる。 Cではvoid*はあらゆるポインタ型に暗黙に変換できるので、これでも特に問題はない。 C++ではvoid*の暗黙の変換が無くなったので、(void*)0をNULLの定義には使えなくなった。 つまり例えば int *p = (void*)0; というのはCでは通るがC++では通らない。
- 501 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 16:08:17 ]
- >>486
16進定数は0xで始まらないといけないので、数値0をあらわすには0x0とする必要がある。
- 502 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 17:58:23 ]
- >>499
kwsk
- 503 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 17:59:57 ]
- kwsk聞いたら宣言の話だった、というのは無しにしてほしい。
|

|