1 名前:デフォルトの名無しさん [2007/10/24(水) 04:07:56 ] なんと!意外にもスレが無かったので立ててみました 先日のソフトウェア開発技術者試験午後UのB木のポインタ表現 近年の基本情報技術者試験の午後C言語問題の自己参照構造体 など物凄く出来が悪いです。 ゆとり?文系?自作減少? ブラックボックス化されてメモリ管理やコンピュータの細かい知識が不要となった? 本当にポインターは必要なのか!?議論しましょう
2 名前:デフォルトの名無しさん [2007/10/24(水) 04:08:11 ] ポインタ死ねよ。 pc11.2ch.net/test/read.cgi/tech/1171172537/
3 名前:デフォルトの名無しさん [2007/10/24(水) 04:08:47 ] ポインタでお勧めな本を教えてください やっぱり一番有名なのは、ポインタ完全制覇ですか? ttp://www.amazon.co.jp/C%E8%A8%80%E8%AA%9E%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E5%88%B6%E8%A6%87-%E6 %A8%99%E6%BA%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%82%BA%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-%E5%89%8D%E6%A9%8B-%E5%92%8C%E5%BC%A5/dp/4774111422 こっちの本には自己参照構造体によるリストだとか木構造が無い ttp://www.amazon.co.jp/C%E8%A8%80%E8%AA%9E%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%8C%E7%90%86%E8%A7%A3%E3%81%A7%E3%81 %8D%E3%81%AA%E3%81%84%E7%90%86%E7%94%B1-%E6%9C%9D%E4%BA%95-%E6%B7%B3/dp/4774114316
4 名前:デフォルトの名無しさん [2007/10/24(水) 04:09:04 ] kmaebashi.com/programmer/pointer.html
5 名前:デフォルトの名無しさん [2007/10/24(水) 04:12:01 ] ポインタのポインタ 関数のポインタ 文字列のポインタ 配列のポインタ
6 名前:デフォルトの名無しさん [2007/10/24(水) 04:12:55 ] /⌒\ / / ̄ ̄ ̄ ̄ ̄ ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |/ \ < 今、ポインタ殺してきた。リアルで。 / ∠,,_ノ ソ _ ,,.. _) \__________________ /| '',,((ノ ) ノ (\) | | |  ̄'  ̄ イ ハァ ハァ \| υ 、_/ロロロ)_ ノ /  ̄ ̄ \ /| υ \ ( .| / ノ ̄ ̄ ̄) ノ \ ヽ.|◯ | ノ ̄ ̄ ̄) /\ ○\ /.| o .| ノ ̄ ̄ ̄) / \ o゚ \
7 名前:デフォルトの名無しさん [2007/10/24(水) 04:14:15 ] C言語は卑猥すぎる。 何がって、*がだよ。*ですよ*。もう形からしていやらしい。 しかも名前は逆参照演算子。普通とは逆に突っ込む。 意味はポインタ。挿すものだなんて…製作者は何を考えてるんだか。 *を付けた変数をファック。 とても18未満には教えていいような言語じゃないね!
8 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 04:15:50 ] 作ってわかるCプログラミング(著:日下部)のポインタでつまづいてオワタ\(^o^)/
9 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 06:11:15 ] つかポインタのサンプル何本か読んで理解できなかったら適性がない。 この先無理やり続けてもろくなことにはならないから 素直に公務員を目指したほうがいい。
10 名前:デフォルトの名無しさん [2007/10/24(水) 07:18:49 ] >>6 キショイ消えろ。
11 名前:デフォルトの名無しさん [2007/10/24(水) 07:30:45 ] 1:何も付けない 2:*を付けてみる 3:&を付けてみる 全部試して落ちないのが正解
12 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:41:51 ] どうでもいいけどCのポインタの記法はキショい
13 名前:デフォルトの名無しさん [2007/10/24(水) 07:54:11 ] int *p; int* p; どっちの書き方します?
14 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:58:27 ] 後者は素人
15 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 08:14:55 ] int i, *ip; って書き方を考えると前者。 C++だと後者かな。
16 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 09:08:21 ] C だと int *p; C++ だと int* p; と書いている。
17 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 09:09:52 ] そのネタでしか伸ばせないならもう終わろうぜ
18 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 10:13:31 ] じゃあ次はモナドはどうやって学ぶべきかで頼む
19 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 11:14:13 ] ポインタ理解できない人は、メモリにデータが配置されるってことを 「紙の上」でのみ理解してるんだろうね。
20 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 11:21:39 ] 理解できてる人は何で理解してんの? やっぱイケてるC使いは実際にアセンブリ言語でメインメモリいじくっちゃったりしてたんスかね?
21 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 11:26:07 ] メモリ配置がうんたらより 単純に演算子がややこしいだけ
22 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 11:26:31 ] アセンブリで書いていたこともあるけど、あんまり関係なくないか。 やっていればそりゃあメモリのイメージを掴むのに有利かもしらんけど。 とにかくなんかメモリの塊があって、そこを指している矢印があって、 その矢印がポインタだというイメージでいいんじゃないの。
23 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 11:28:33 ] 無能なマの馴れ合いはマ板でやれ ポインタ厨へ。ポインタは糞。イラネ。 pc11.2ch.net/test/read.cgi/prog/1140086684/
24 名前:デフォルトの名無しさん [2007/10/24(水) 11:28:48 ] >>20 いや、ワンボードしかなかった時代に、コンピュータをいじり始めたから、分かるだけなのだが...。
25 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 11:32:10 ] 間接参照表現にキャストする演算子だと思えばいいんでねえの?
26 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 12:30:22 ] ttp://japanese.joelonsoftware.com/Articles/Interviewing.html どうやら大部分の人々はポインタを理解するための脳の一部分を持たずして生まれてくるようだ。 ポインタの理解はスキルではなく、才能の類である。 ポインタの理解にはインダイレクト且つ多重に関連付けを行う論理的思考が要求され、 どうあがいてもそれが出来ない人だっているのだ。
27 名前:デフォルトの名無しさん [2007/10/24(水) 14:42:26 ] 俺なんかポインタのポインタを扱えるようになるのに10年かかった。
28 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 15:06:14 ] >>27 例えばstrtol()みたいな関数も使えなかったわけですね?
29 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 15:56:49 ] >>28 ポインタのポインタを使った処理を思い通りに(納得行くかたちで)組めるようになるのに10年てこと。
30 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 16:00:00 ] >>20 Cでvramをレイプしてました
31 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 16:39:28 ] 関数の呼び出し方が分かったら、なぜポインタが必要かわかる
32 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 17:35:48 ] ポインタへのポインタが分からないと 2次元配列の動的確保さえできないんだよな…
33 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 17:53:02 ] d
34 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:00:11 ] アセンブラを学べばポインタも身につくってホント/ウソ?
35 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:13:39 ] ポインタはランダムアクセスイテレータ
36 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 22:40:29 ] >>34 ハンドアセンブルなら完璧。
37 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 22:53:52 ] ポインタ、面白いと思うんだけどな。
38 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 12:09:52 ] s03.2log.net/home/programmer/archives/blog38.html
39 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 12:10:49 ] >>37 その面白さを若い奴らにどう伝えていくのか 技術の継承もおじさん世代の役目
40 名前:デフォルトの名無しさん [2007/10/25(木) 13:23:34 ] ポインタなんか要らないと言う話 homepage3.nifty.com/mogami/diary/d0710.html#242
41 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 17:09:55 ] ポインタ厨へ。ポインタは糞。イラネ。 pc11.2ch.net/test/read.cgi/prog/1140086684/
42 名前:デフォルトの名無しさん [2007/10/25(木) 18:41:27 ] C言語のポインタの文法はおかしい pc8.2ch.net/test/read.cgi/tech/1115419223/
43 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:04:09 ] ポインタを知らないと、参照渡しと値渡しの違いが分からないだろ 逆にその違いが分かればポインタも分かる
44 名前:デフォルトの名無しさん [2007/10/25(木) 19:08:18 ] 想像力のない奴め、教えてやるよ。 それは、ポインタという形にしてアドレスを意識しなくてもプログラミングできるようになったから C以降にプログラマになった奴はアドレスを意識する必要性に迫られなかったからだ。 覚える必要がないから覚えなかった。だから理解できなかった。そういうことだ。
45 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:22:27 ] ポインタ役たつけどなぁ
46 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:30:01 ] ポインタを安全にした仕組みでできなくて、ポインタでできる有益なことってなにかある?
47 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:34:23 ] 連結リスト
48 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:36:20 ] ダブルポインタ
49 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 20:04:42 ] >>47 ノードオブジェクトがほかのノードオブジェクトの参照を持つ、ではだめか? >>48 オブジェクトがほかのオブジェクトをもって、そのオブジェクトがまたほかのオブジェクトを持つ、じゃだめか?
50 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 20:09:46 ] ポインヨはランダムアクセスイテレータの実装の一つです
51 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 21:23:23 ] C言語をいくらやっても分からず、アセンブラを学んだとき ドミノが倒れるように全てを理解した あの感動を体験したいならまずC言語からやるのだ メモリやアドレスの定義もない、入門書からやるのだ これは数学と似ている。 集合も論理学も教えない。だからクラスの誰も分からない 大学に入って初めて秘密を知るのだ。 まあ無駄なのでアセンブラからやれ
52 名前:デフォルトの名無しさん [2007/10/25(木) 21:56:23 ] >>51 CASLUでもいいですか?試験の為に本買ったんですが、Cの勉強(学校)が忙しくて放置したままです。
53 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 22:26:42 ] 8086がいい。
54 名前:デフォルトの名無しさん [2007/10/26(金) 07:12:07 ] 初めて読む8086とかいうやつ?
55 名前:デフォルトの名無しさん [2007/10/26(金) 11:30:54 ] >>53 まあ使うことのないだろうx86系のアセンブラで勉強するか、組み込みで使う可能性のある、ワンチップ マイコンのアセンブラで勉強するか、どっちが実用性があるんだろうか?
56 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:00:09 ] ポインタよりもC++の参照がよく理解できない
57 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:25:33 ] >>56 俺も。 一回参照設定したら変更できないのが参った。 ポインタの変り種だとおもったんだけど違うらしい。
58 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 17:16:59 ] >>55 パソコン買えば漏れなく付いてくるx86系の方が実効性は高い
59 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 21:42:30 ] >>56 C++の参照は、constなポインタ。 変数宣言時、関数の引数、コンストラクタの初期化リスト内でしか 値を初期化できないように制限してある。 ポインタには、大きなデータのコピーを避けるための"共有"の意味と 配列等で個々の位置を表すための"イテレータ"としての意味とがあるけれど、 後者は使い方を間違えると危険だから前者しかできなくなっているということ
60 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 21:57:09 ] 参照は正直、std::stringやstd::listを渡すときくらいしか使わんな なんとなくポインタだと不自然だから参照で渡してる感じ >>46 とあるメモリー上のデータの塊を、プログラマの都合で「違う解釈の仕方で読む」ことができるのが魅力 当然スピードを気にしなければJavaとかでもできるが、スピードの劣化が一切無くできるのがポインタの魅力
61 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:36:04 ] >>56 要するに、int *p と int &pは無関係 int *const p と int &p const int *const p と const int &p が対応してる
62 名前:デフォルトの名無しさん [2007/10/27(土) 00:42:03 ] アナルアナルうるせーよ
63 名前:デフォルトの名無しさん [2007/10/27(土) 10:36:58 ] 演算子の表記法に問題があるんだよ。 同じ*でも、型宣言と、中身を取り出すときの両方で使うから初心者にはややこしい・・・
64 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 12:10:18 ] >>59 へーへー 俺もC++の参照よくわからんかったのでもっぱらポインタで代用してたけど こういう意味だったのね
65 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 12:34:46 ] >>60 > 参照は正直、std::stringやstd::listを渡すときくらいしか使わんな > なんとなくポインタだと不自然だから参照で渡してる感じ 俺はむしろ逆だな。ポインタとしての機能を必要としない限り参照 (あるいは値)で渡す。安全第一だからね。
66 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:20:28 ] >>65 大抵shared_ptr使っちゃうからなぁ
67 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 21:46:05 ] >>66 boost は俺も結構使うけど、あまり必要無いときは使わない。 参照で OK なのにわざわざ boost 持ち込むとかはせん。
68 名前:デフォルトの名無しさん [2007/10/28(日) 10:04:33 ] あ
69 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 11:45:20 ] アセンブリ言語から始めよう
70 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 11:50:55 ] 俺はこれでそれなりに理解した気分になった www.gihyo.co.jp/books/syoseki.php/4-7741-1142-2 まだ買えるのかは知らない
71 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 14:19:45 ] ポインタは特定の場所をポイント、だから!指差すものだと何度いったら。。。
72 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 16:10:45 ] なぜポインタを理解できないのかが理解できないから、教えようがないんだよねえ。
73 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 16:16:43 ] POD型の動的な多次元配列をポインタを使って実装するなら問題ないけど テンプレートメンバ関数ポインタを引数に取る関数のポインタの配列のポインタ とかなると意味わからなくなるんだけどこれは理解できてないからだな
74 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 16:53:27 ] ポインターをうまく言い表す日本語が鍵だな
75 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 17:43:50 ] >>61 C++ の参照渡しは、 int &p で宣言した関数に対して 呼び出し側では普通に int を渡すのが混乱した。
76 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 17:46:13 ] c++ の場合は定義の際は & つかうくせに実際に呼ぶときは 普通に呼べるのは便利だが、混乱の元でもあるね。
77 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 17:58:23 ] つーか。参照渡しを表す & とアドレス演算子を表す & に 同じ記号を使うように決めたデザインがド間抜けに一票。
78 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 18:02:34 ] ポインタもポインタで定義の際に*使うくせに 実際に呼ぶとき*をつけると中身が出てくる謎仕様 宣言と間接参照演算子が同じってだけで、結局は慣れなんだけどね。
79 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 18:28:25 ] >>78 int *p; ってのは、「*pがint型」という意味でそのような仕様にしたらしい。
80 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 18:51:16 ] 呼び出し側のソースを見たとき値渡しなのか参照渡しなのかわからないから参照嫌い
81 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 01:52:21 ] 単純な8bitCPUとかPICとかのアセンブラを学んで見ると良い。 アセンブラで登場する各種のアドレッシングモードを理解出来れば ポインタなんてそれほど難しいもんじゃないよ。
82 名前:デフォルトの名無しさん [2007/10/29(月) 18:48:11 ] Ruby使え
83 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 19:36:22 ] >>79 おお、なるほど。そう説明されればわかりやすいな
84 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:07:16 ] ポインタのポインタと 配列のポインタを 混同または理解していない香具師が多い
85 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:49:55 ] ポインタの配列?
86 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:53:24 ] >>84 おまえのこと?
87 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:14:41 ] ポインタのそのまたポインタのそのまたポインタ・・・・・訳わかめ
88 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:27:45 ] ポインタって、↓こうあるべきじゃね? int i = 0; pointer p = new pointer(i); pointer p2 = new pointer(p); p.type → int *p → 0 p2.type → pointer *p2 → p **p2 → 0
89 名前:デフォルトの名無しさん [2007/10/30(火) 16:48:43 ] プログラマなら、いるいらないではなくて、常識です。
90 名前:デフォルトの名無しさん [2007/10/30(火) 19:49:04 ] >>88 そういう実装にすりゃいいじゃない。
91 名前:デフォルトの名無しさん [2007/10/31(水) 06:55:33 ] www.dotup.org/uploda/www.dotup.org0324.gif
92 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 09:29:33 ] ・ポインタとは、「メモリ上のアドレスを指し示す」変数である。 ・ポインタのみでは実体が無いため、malloc()でそのアドレスを先頭とした実領域を確保する必要がある。 この2点だけ意識してれば十分使えると思うんだけど。何故理解出来ないのかが理解出来ない。
93 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 10:35:46 ] データはふわふわと浮かんでるようなイメージでも持ってるのかも ある「どこかに」はなく、箱の中をただよっているという
94 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 10:41:44 ] そういうのを意識してたら 「関数ポインタを引数にとる関数ポインタの多次元配列のポインタ渡し」とかパッと書けるもんなんでしょうか? だとしたら俺は理解できてないな…
95 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 11:07:45 ] 四則演算だったら、どれだけ長くなっても難しいとは思わないだろ 1+5-3+2*6+・・・ ポインタだって同じ
96 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 11:10:06 ] そりゃあ規則が明確だからね でもポインタ演算の規則を明確に理解しようと思ったらタイプ理論とかの知識がいるんでしょ?
97 名前:デフォルトの名無しさん [2007/10/31(水) 11:29:07 ] 0から100までの偶数の合計を求めるプログラムを作成せよ. ただしfor文を使用すること. また,条件分岐(if文とswitch文)を使ってはならない. 課題3 かけ算の九九を以下の例のように表示するプログラムを作成せよ. ただし,for文のネストを使用すること. 1 x 1 = 1 1 x 2 = 2 1 x 3 = 3 ... 1 x 9 = 9 2 x 1 = 2 2 x 2 = 4 ... 9 x 9 = 81 課題4 トランプのカード(ジョーカーを除く)を以下の例のようにすべて表示するプログラムを作成せよ. ただし,for文のネストとswitch文を使用すること. スペードの A スペードの 2 スペードの 3 ... スペードの 10 スペードの J スペードの Q スペードの K ダイヤの A ダイヤの 2 ダイヤの 3 ... 助けてくれ。。。 じゃヴぁで頼む。。。
98 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 11:32:50 ] >>97 スレチ
99 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 11:48:16 ] プログラムが扱えるメモリ空間からスタックと静的領域除いた全てをmallocすればアドレス直指定だけで変数の宣言も定義もいらない幸せプログラミングが
100 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 11:52:44 ] そんな風にやるなら、そもそもmalloc必要なくね?
101 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 12:08:50 ] 宣言の場合、全ては void* で、アドレスであると考える 使う場合、通常の変数とずれがあるので混乱するが、以下の関係がある *pointer = var; pointer = &var; *foo.pointer = *foo->pointer = foo.var = foo->var; foo.pointer = foo->pointer = &foo.var = &foo->var; どちらの形式をとっても、 アドレスと値のどちらにもアクセスできるようにしてあるという点が重要 (ただし、&var には代入できない・const void*とみなせる) 通常の変数は値を出し入れすることに主眼が置かれていて、 ポインタ変数はアドレスのほうを出し入れすることに主眼が置かれている
102 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 12:09:11 ] >>99 全てを自分で管理するなら、そもそも高級言語は必要ないんじゃ?
103 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 12:14:30 ] int *(*(*ponta[N])(int, int (*)(int)))(int); やっぱ、ポンタってむずいな、orz
104 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 12:24:04 ] ポンタwwww
105 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 19:02:31 ] >>85 84が言いたいのは↓こういうことじゃね #include <stdio.h> int main() { short *p, **pp, *pa[9], (*ap)[9]; pp = &p; printf("ポインタのポインタ: size:%d",sizeof(pp)); printf("\tstep:%d\n",(void *)(pp+1)-(void *)pp); printf("ポインタの配列: size:%d",sizeof(pa)); printf("\tstep:%d\n",(void *)(pa+1)-(void *)pa); printf("配列のポインタ: size:%d",sizeof(ap)); printf("\tstep:%d\n",(void *)(ap+1)-(void *)ap); getchar(); return 0; }
106 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 19:20:33 ] 103が言いたいのは↓こういうことじゃね #include <stdio.h> int main() { short *p, **pp, *pa[9], (*ap)[9]; pp = &p; printf("ポンタのポンタ: size:%d",sizeof(pp)); printf("\tstep:%d\n",(void *)(pp+1)-(void *)pp); printf("ポンタの配列: size:%d",sizeof(pa)); printf("\tstep:%d\n",(void *)(pa+1)-(void *)pa); printf("配列のポンタ: size:%d",sizeof(ap)); printf("\tstep:%d\n",(void *)(ap+1)-(void *)ap); getchar(); return 0; }
107 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 19:31:20 ] ポンタ微笑ます
108 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 19:35:39 ] >>106 103がいいたいのは>>94 でしょ typedef (*pfpf)(int (*)(int)); pfpf pfpfaa_tmp[9][9]; pfpf*** fuck; fuck = &pfpfaa_tmp;
109 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 19:39:24 ] typedef int(*pfpf)(int (*)(int));だった(’ω´)
110 名前:デフォルトの名無しさん [2007/10/31(水) 20:54:21 ] * をデリヘル演算子って呼ぶのがはやってた
111 名前:デフォルトの名無しさん [2007/10/31(水) 20:59:15 ] エロ写真の乳を如何に鷲掴みしようとしても それはポインタであり実体はそこにはないのである。
112 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 21:01:22 ] 下手
113 名前:デフォルトの名無しさん [2007/10/31(水) 23:02:27 ] >>1 これから技術者として生きていきたいと、もし君が思っているとしたら。 「〜〜だから、これは学ばなくていい。」という考え方は、 ひとまずやめたほうがいい。 まだ君は、どの情報が必要で、どの情報が必要でないと判断できないわけだから。 まずは、とにかくトコトン悩んでやってみることだよ。 自分の方向性を決めるのは、その後でも十分だと思う。
114 名前:デフォルトの名無しさん [2007/11/02(金) 08:35:23 ] JavaやC#などの次世代の言語にもポインタの概念はしっかり受け継がれてるから知っておいて損はないかと
115 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 08:41:06 ] 教えたがりしかいねーなこのスレw
116 名前:デフォルトの名無しさん [2007/11/02(金) 19:13:53 ] これで文字列が代入されないのは何故ですか??? ↓を改善させるためにポインタのポインタを使わなきゃいけない理由は何故ですか? void myalloc(char *p1, char *p2) { p1 = malloc(20); strcpy(p1, "first string"); p2 = malloc(20); strcpy(p2, "second string"); } int main(void) { char *p1; char *p2; myalloc(p1,p2); printf("p1=%s p2=%s\n", p1, p2); return 0; }
117 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:32:37 ] >>115 ポインタがよくわかりません。教えてください><
118 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:36:16 ] >>116 myalloc(char *p1, char *p2)のp1,p2とmainのp1,p2が別の人だから。
119 名前:デフォルトの名無しさん [2007/11/02(金) 19:42:46 ] >>118 値渡しではなく、参照渡し(アドレス渡し)にしているのにですか?
120 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:46:42 ] >>119 どこが? void myalloc(char *p1, char *p2) はchar*の中身を渡しているだけで、 char*自身を渡してないよ。
121 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:00:53 ] int main(void) { char *p1 この段階ではp1には不定な値が入っている。例えば0xfefefefeだとしておこう void myalloc(char *p1, char *p2) { これが呼ばれた段階で p1 == 0xfefefefe p1 = malloc(20); この段階で p1 には何かしらのアドレスが入る。例えば0x00001000 としよう myallocを抜ける段階でp1という変数は消えてなくなる。 なぜならp1はローカル変数だからだ 結局のところ、myallocのp1は、mainのp1が保持していた 0xfefefefeという値とコピーしたローカル変数に過ぎない そのローカル変数にmallocの返り値を保存しても、mainのp1には何の影響もないわけだ
122 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:01:56 ] >0xfefefefeという値とコピーしたローカル変数に過ぎない 0xfefefefeという値「を」コピーしたローカル変数に過ぎない だった。意味が通じなくなりそうだから念のため修正
123 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:07:56 ] 仮に void myalloc(char p1, char p2) で考えてみよう。 main(){ char p1='a' char p2='b'; myalloc(p1,p2) } こうした時myalloc(p1,p2) にやってくるのは'a','b'という値。 なのでmyalloc(p1,p2)の中でp1,p2を変更してもmainの中のp1,p2は変化しない。 あとは*をつけるだけ。 void myalloc(char *p1, char *p2) main(){ char* p1="a"; char* p2="b"; myalloc(p1,p2) }
124 名前:デフォルトの名無しさん [2007/11/02(金) 20:09:33 ] あ〜なんとなくわかった気がします つまり・・・
125 名前:デフォルトの名無しさん [2007/11/02(金) 20:11:15 ] mainのchar *p1が指すアドレスが入っているだけで、 mainのp1自身のアドレスを渡しているわけではないんですね
126 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:13:20 ] >>125 そうです。結構はまるポイントですね。これ。
127 名前:デフォルトの名無しさん [2007/11/02(金) 20:17:40 ] あれ?いやまた分からなくなってきた ↓改善したプログラムですが・・・*p1と*p2もローカル変数だから消えちゃって・・・ void myalloc(char **p1, char **p2) { p1 = malloc(20); strcpy(*p1, "first string"); p2 = malloc(20); strcpy(*p2, "second string"); } int main(void) { char *p1; char *p2; myalloc(&p1,&p2); printf("p1=%s p2=%s\n", p1, p2); return 0; }
128 名前:デフォルトの名無しさん [2007/11/02(金) 20:20:22 ] まちがった ↓改善したプログラムです void myalloc(char **p1, char **p2) { *p1 = malloc(20); strcpy(*p1, "first string"); *p2 = malloc(20); strcpy(*p2, "second string"); } int main(void) { char *p1; char *p2; myalloc(&p1,&p2); printf("p1=%s p2=%s\n", p1, p2); return 0; }
129 名前:デフォルトの名無しさん [2007/11/02(金) 20:21:08 ] >>128 が>>116 とどう違うのか **になると一気にわからなくなる
130 名前:デフォルトの名無しさん [2007/11/02(金) 20:23:27 ] >>127 実に惜しい つーか怖いwww void myalloc(char **p1, char **p2)の中のp1はmainのp1をポインタに持つポインタなので・・・ mainのp1のポインタに対してmallocするには・・・ ていう。
131 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:25:26 ] こういうところでポインタ宣言と間接参照演算子が同じってのが邪魔してくるんだよな あと名前の設定をミスってるのが大きい。 char*のやつは文字列型っぽい名前にしなくちゃいけないし、 引数のほうは文字列型のアドレスっぽい名前にしなくちゃ。
132 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:27:50 ] ってよく見たらmallocおかしいじゃねえかw
133 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:28:39 ] >>129 一回名前かえよう void myalloc(char **pp1, char **pp2) { } int main(void) { char *p1; char *p2; } とすると、pp1はp1を値に持っている。なので*pp1=p1 *pp1をいじると当然p1も変わる。
134 名前:デフォルトの名無しさん [2007/11/02(金) 20:29:31 ] 図で描けたら簡単なんだけどな・・・
135 名前:デフォルトの名無しさん [2007/11/02(金) 20:30:38 ] >pp1はp1を値に持っている 『pp1は&p1を値に持っている』じゃなくて>『pp1はp1を値に持っている』ですか?
136 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:40:12 ] >>135 サーセン『pp1は&p1を値に持っている』です。
137 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:40:23 ] ソースコードでオナニーできて一人前
138 名前:デフォルトの名無しさん [2007/11/02(金) 20:40:49 ] いや、pp1はp1を値に持っているでいいんだ。
139 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:46:44 ] &&pp1 &pp1 pp1 *pp1 **pp1 ***pp1 処理の度に全部printfで表示させればいいんだよ
140 名前:デフォルトの名無しさん [2007/11/02(金) 20:58:48 ] ベテランの人たちはダブルポインタを扱うとき いちいち頭で考えて使っているんですか? それとも体が勝手に動くものなんですか?
141 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:02:40 ] 別にベテランじゃないけど上にあるやつくらいだったら まともな命名法と*の読み方しだいで何とかなる範囲じゃね?
142 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:06:31 ] 当然頭は使ってるけど何度も使ってれば考える時間は短くて済むようになる
143 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:18:29 ] C++ならダブルポインタは使わないで済むけどね
144 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:21:23 ] あれ、>>128 で合ってるだろ?と思ったらまちがったって言うのは >>127 がコピペ失敗って意味じゃなくて>>127 がバグだったって意味ね
145 名前:デフォルトの名無しさん [2007/11/02(金) 22:00:46 ] freeはいつ呼べばいい?myfree作るべき?
146 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:21:47 ] 宗教論争になりがちだからお好きなように…かなw
147 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:26:52 ] スマートポインタ使え
148 名前:デフォルトの名無しさん [2007/11/02(金) 22:45:47 ] ポインタって要するに参照渡しのことですよね?
149 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:52:16 ] 参照渡しっていうとなにかとC++の参照が出てくるから困る
150 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:59:47 ] >>148 参照はダブルポインタ。
151 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:42:12 ] 「ダブルポインタ」っていうのは素人が使う言葉
152 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 11:51:23 ] 「ダブルポインタ」「ポインタのポインタ」 なんて呼び方はやめて普通に 「ポインタへのポインタ」 って呼べばいい という主張をどこかで見たな
153 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 12:36:52 ] 素人は「ダブルポインタ」なんて知らんだろ
154 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 12:47:29 ] 参照とダブルポインタは違うよね?
155 名前:デフォルトの名無しさん [2007/11/03(土) 14:01:21 ] 問題は「ダブルポインタ」と言ってしまうと 「配列へのポインタ」と「ポインタへのポインタ」の どっちの話をしているのかが決まらないまま話が進むこと ↓ だから素人同士の会話でしか使われない表現ということ
156 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:01:35 ] ダブルポインタなんて2chでしか貴下ねーな
157 名前:デフォルトの名無しさん [2007/11/03(土) 14:03:22 ] 補足 × 問題は「ダブルポインタ」と言ってしまうと ○ 問題は「char **p;」の表記だけを見て「ダブルポインタ」と言ってしまうと
158 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:09:53 ] ちょっと暇つぶししてみた ダブルポインタ に一致する日本語のページ 約 3,040 件 ポインタのポインタ に一致する日本語のページ 約 9,800 件 配列のポインタ に一致する日本語のページ 約 672 件 ポインタへのポインタ に一致する日本語のページ 約 616 件 配列へのポインタ に一致する日本語のページ 約 14,800 件 最近はブログのせいでごみばっかり引っかかるようになってしまった と言っても以前はマニュアルのコピーばっかり引っかかってた訳だが
159 名前:デフォルトの名無しさん [2007/11/03(土) 14:13:28 ] そもそも重複スレだし pc11.2ch.net/test/read.cgi/tech/1171172537/49-
160 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:15:27 ] (T** a)みたいにするんじゃなくて (T* *a)にしたら少し理解しやすくなったかもしれないこともなかったような気がした
161 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:19:18 ] 左の * と 右の * はどっちが優先度高いんだっけ?
162 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:20:59 ] char str[256]; char *p; p = str;
163 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:21:07 ] 漏れがCやり始めた頃はダブルポインタなんか言ってる香具師は一人もいなかったな だれが流行らせたんだ?メジャーな入門本に書いてあるのか?
164 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:22:54 ] >>163 int *p; イントポインタ double *q; ダブルポインタ これをだれかが間違って解釈して 馬鹿の間で蔓延したと思われ
165 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:24:54 ] それは確かにダブルポインタwwwww
166 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:28:21 ] >>164 それ見てダブルポインタなんてアホな呼び方してるのは 日本人だけだろうと思って調べてみたが 毛唐の間でも普通に使われてるのな double *p; int **p; 両方の意味でw
167 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:30:24 ] >>157 char **p; と書いて配列へのポインタと解釈することなんてありえるか? 配列へのポインタといったら char (*p)[N]; じゃないのか?
168 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:31:55 ] >>167 int main(int argc, char **argv)
169 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:32:28 ] ちなみにmeta-pointerって呼び始めたのは俺。 MITで今じゃ完全に定着しているって後輩が言ってた。
170 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:32:48 ] >>168 それはポインタの配列
171 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:37:23 ] 配列のポインタとポインタの配列は区別しようぜ
172 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:45:37 ] 馬鹿が馬鹿に説教するスレはここですか?
173 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:48:52 ] >>171 ポインタの配列とダブルポインタの区別はしなくても平気ですか?
174 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:48:53 ] 馬鹿じゃないよ C言語は得意だけど日本語が苦手なだけだよ
175 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 15:16:47 ] double *pは「double型へのポインタ」だろ。そうとしか読めない。
176 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 15:18:28 ] ダブルポインタって言葉をほとんど聞いたことが無い
177 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 15:27:47 ] 俺はある
178 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:10:38 ] 二重ポインタならよく聞くけど、ダブルポインタは滅多に聞かないな。
179 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:23:17 ] 二重ポインタは初耳 ポインタへのポインタばっかり
180 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:40:33 ] 今の今までインディレクトポインタと呼んでいたぞ。
181 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:48:30 ] 昔、面接で「ダブルポインタはOKですが、トリプルポインタは自信がありません」と言った香具師がいた。 案の定、ポインタを理解していなかった。
182 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:52:53 ] pc11.2ch.net/test/read.cgi/tech/1171172537/49
183 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:53:31 ] pc11.2ch.net/test/read.cgi/tech/1171172537/52
184 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:55:27 ] そうだ。ダブルポインタとはdouble*のことに違いない。
185 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:00:19 ] ポインタへのポインタへのポインタは使ったことがない気がする
186 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 01:59:00 ] *** は滅多に使わないけど全く使わないということはない ただそういうときには typedef するか struct になってることの方が多い
187 名前:デフォルトの名無しさん [2007/11/04(日) 06:03:01 ] >>186 使い道が想像できん。
188 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 10:44:18 ] >>187 行列の配列とか?
189 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:25:14 ] 3次元の配列の動的確保
190 名前:デフォルトの名無しさん [2007/11/04(日) 13:17:16 ] 文字列の二次元配列を使おうとしたときに どうすればいいか分からなかった漏れが来ましたよ
191 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:32:29 ] char Array[32][16];
192 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:34:02 ] >>191 いやそれ文字列になってないw
193 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:35:08 ] 文字の二次元配列だな
194 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:50:07 ] std::vector<std::vector<std::string> > Array;
195 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:51:26 ] >>192-193 /(^o^)\
196 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:13:34 ] std::vector<std::vector<std::string *> *> *Array;
197 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:38:22 ] std::vector< tr1::shared_ptr< std::vector< tr1::shared_ptr< std::string > > > > ary;
198 名前:デフォルトの名無しさん [2007/11/04(日) 20:31:42 ] ベクター
199 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 20:32:50 ] ベクトル
200 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 20:34:06 ] う゛ぇくとぉ
201 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 20:40:22 ] typedef char *string; string Array[32][16]; /* 200 get */
202 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:16:19 ] え?
203 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:40:49 ] ウルトラ警備隊に聞いてみろ
204 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 01:07:41 ] ポインタを理解できない人は、C言語 ポインタ完全制覇を読みなさい。 それでも、わからなければ・・・・ 私は知らん。
205 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 01:29:37 ] >>204 あれはいいものだ・・・
206 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 07:48:59 ] 考え方や概念よりも、文法がややこしいんだと思うよ。 変数に成り代われるのは演算子のおかげであって、ポインタ自体はアドレスを指すことしか出来ないんだから。
207 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 12:15:17 ] ああ、ポインタの概念自体をさっぱり理解できない人はまずいない。 演算子の扱いとか、関数の引数や戻り値としての扱いとか、直観に反する振る舞いをするのでつまづく。
208 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 14:27:35 ] 滅茶苦茶直観的だけど
209 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 15:33:15 ] ここに書いてあったので「へー、ダブルポインタって呼ぶんだ、初めて聞いたな」と思ってダブルポインタと早速呼称してたorz
210 名前:デフォルトの名無しさん [2007/11/05(月) 19:02:30 ] ポインタなんて、実はだだの正数値が入ってる変数なんです 変数と知れず変数を指し示す物と考えると理解が難しいのかもしれません int a; int *p; p = &a; *p = 10; printf("%d",a); 結果: 10 普通はやりませんが以下の様に正数型をポインタとしても使えます int a; unsigned int p; p = (unsigned int)&a; *(int*)p = 10; printf("%d",a); 結果: 10 このようにキャストをしっかりしてやれば代用が利いたりします でも、64ビットOSだとこれは変更が要りますが64ビットOSはポインタのサイズが32ビットが64ビットの正数型になるだけなので64ビット長の正数型を用意するだけで良いだけのことですけどね
211 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:33:55 ] 処理系依存なことを言語仕様に定められてるかのように書くなよ・・・
212 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:43:46 ] >>210 そもそも正数っていうのは0より大きい実数のことであって、 unsigned intっていうのは0以上の整数のことであるわけだが。
213 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:48:18 ] >>212 それ自然数
214 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:49:06 ] じゃなくてあってんのか。 まあいいや。
215 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 20:07:26 ] というかこんなことが出来たとして何の役に立つの?
216 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 20:56:27 ] 出来ない奴が役に立たない
217 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:15:37 ] ポインタをintにキャストする人は役に立つんだね 知らなかったよ
218 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:24:33 ] 俺は知ってた
219 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:55:12 ] 過去に一回だけそんな使い方をしたことあるな・・・ なんでそれをやったかは忘れた
220 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:11:37 ] ポインタ値の配列の宣言がわからなくてintの配列で代用した こんなあたりだろ
221 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:14:25 ] ポインタの配列ってこうでいいんじゃないんですか? int* pointa[10];
222 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:16:26 ] 確かにそうだが変数名が気に入らないw
223 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:39:02 ] >>222 気にしては駄目だw
224 名前:デフォルトの名無しさん [2007/11/06(火) 00:52:22 ] ポインタの配列 int* ponta[10]; int配列へのポインタ int(* ponta)[10]; でいいんですよね?
225 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:55:41 ] int[]型みたいなのが無いから書き方がカオスだな
226 名前:デフォルトの名無しさん [2007/11/06(火) 00:58:13 ] ポインタの文法を学ぶ前になんでポンタが必要かを理解させないから苦労して学ぶ気になれないのでは なんで?最近の言語はコンパイル時に勝手に最適化してくれるんじゃないの? WEB系ではいらない? 汎用系では? 制御・ファーム・ハード系では? ソフト系では?
227 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:59:50 ] 『昔のPC・OSではな〜メモリが64KBしかなくてな〜』とか言う懐古厨はお断り
228 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 01:06:17 ] 最近の若い子はなんでも参照で済ますから・・・
229 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 01:08:29 ] >>224 たしか、それでおkなはず
230 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 02:56:11 ] int a; double *p; p = (double *)&a; *(int*)p = 10; printf("%d",a); 結果: 10
231 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 03:39:01 ] 当たり前って言えば当たり前
232 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 08:32:43 ] >>230 それは流石に駄目だろう 多分、出来なくはないだろうけど浮動小数点数の演算が適応されないポインタに対してこれはナンセンス過ぎないか?
233 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 11:10:25 ] int a; double p; p = (double)&a; *(int*)p = 10; printf("%d",a); 結果: >>232 これと勘違いしてない?
234 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 11:42:39 ] >>230 色々怖いな。
235 名前:>>232 mailto:sage [2007/11/06(火) 13:52:26 ] >>233 見間違えサーセンw
236 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 14:59:59 ] sizeof(int*) <= sizeof(double*)な処理系じゃないとダメじゃね? まあこれを満たさない処理系なんてあるのか知らないけど
237 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:17:15 ] >>236 いろいろわかってなさ杉
238 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:29:44 ] 初心者だけど >>233 のコードが実行できると どっかのメモリに10が代入されるってことなのか?
239 名前:236 mailto:sage [2007/11/06(火) 15:34:16 ] >>237 ポインタのサイズは指している型に関わらず同じ、なんてことは無かったような気がするんだけど 間違ってる?
240 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:34:21 ] aに10が入る
241 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:37:47 ] >>239 ポインタはint型のサイズと同じって記憶があるけど。
242 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:37:55 ] >>239 ポインタのサイズが型によって違う処理系教えてくれ
243 名前:デフォルトの名無しさん [2007/11/06(火) 15:47:56 ] >>238 doubleにintポインタのアドレスを入れるけど、 doubleの値をintポインタにキャストしてるから、 結局int aに値を入れてるのと同じ。
244 名前:デフォルトの名無しさん [2007/11/06(火) 15:48:44 ] >>243 語弊があるな、intのアドレスをdoubleの値に入れる。かな
245 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:55:40 ] >>243 なるほどね、読み返して見たら納得できた。
246 名前:236 mailto:sage [2007/11/06(火) 16:24:31 ] どっかで見た気がしたんだが記憶違いだったか しかし、void*とかmallocとか考えるとありえないなorz スレ汚しすまんかった
247 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 16:48:26 ] >>241 それはない
248 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 16:59:09 ] >>241 そういう場合もある
249 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 18:25:36 ] 現状そういう処理系が実在しないにしても 規格上はint *とdouble *が安全に変換できるとは限らない void *を介しても同じ事
250 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 18:37:14 ] 昔々、ポインタにはfarとnearがあっての…
251 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 19:33:07 ] ポインタなんて今時覚える必要ないと思う。 C#とかポインタを気にせずプログラミングできる言語が主流になりゃいい。 今後PCはどんどん高性能化していって統合環境が整うんだからポインタみたいな 危険な構造、なくしてけばいいよ。 そういうのはコンパイラに任せとけ。
252 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 21:20:12 ] 例えば貴方の身の回りの家電や車の制御プログラムにC#を入れるとな? こういうマイコンは限られたメモリをいかに容量的に効率的に高速に使うかが大事
253 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 21:24:25 ] >>252 ただ現実にはそういう方向かもね。携帯とか Java 走ってる。 あと、C 使いこなすにはポインタ理解する必要はあるけど、 必要以上にポインタを使い回す事はない。パフォーマンスが 心配なら実際 profiling してから直すべき。 ついでに、あまり複雑なことをしなけりゃポインタも簡単。
254 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:10:34 ] Javaとかにも、配列の途中からを指す方法があればなあ 配列そのものと、何番目かをあらわすIndexと。二つ渡すのが非常にかっこわるい
255 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:13:04 ] SubList使えよ
256 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:36:26 ] 携帯Javaにはそんな便利なもんねえ
257 名前:デフォルトの名無しさん [2007/11/07(水) 06:26:59 ] >>251 C#、Javaはむしろポインタだらけじゃないか?
258 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 06:56:56 ] >>243 >doubleにintポインタのアドレスを入れるけど、 >doubleの値をintポインタにキャストしてるから、 >結局int aに値を入れてるのと同じ。 double*に入れるときは問題ないけど doubleに入れるときはアドレス値がdouble値としてふさわしくないときに 正規化されて他の正しい浮動小数点数に変換されるだろうから int*にキャストしたときには別の場所を指してる可能性があるね
259 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 07:39:19 ] そんな環境実際にあんの?
260 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 08:32:42 ] >>259 確かにその通り。正規化云々以前にポインタ値をdouble変数に入れられない。
261 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 08:39:01 ] どうせ二進表現の数なんだから、ビット幅さえ合えば入れられるんじゃないの? 数値としては別な物になるだろうけど。
262 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 10:38:38 ] >>261 つ[規格]
263 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 11:06:58 ] アセンブラをやれ でFA?
264 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 14:24:27 ] >>261 longに入れたりintに入れたりは幅だけ合ってれば出来るけど doubleの場合は規格化された値しか入れられないよ
265 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 14:27:32 ] >>261 union { double d; int *p; } hoge; hoge.p = (int *)-1; printf("%f", hoge.d); これやってみ
266 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 19:32:13 ] なんていうか 無理に1000いくまで議論しなくてもいいと思うんだ・・・
267 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:15:55 ] 関数ポインタ int func(int a) { return a*2; } main(){ int (*p_func)(int); p_func = func; (*p_func)(2); //実行方法 }
268 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:25:14 ] 関数へのポインタだろ
269 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:25:29 ] 関数へのポインタへのダボーポインタだろ
270 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 22:42:55 ] これは何ですか?関数配列へのポインタ?関数へのポインタの配列? void (*p_funcs[])(void) = {funca, funcb};
271 名前:デフォルトの名無しさん [2007/11/07(水) 22:43:34 ] ポインタの配列 int* ponta[10]; int配列へのポインタ int(* ponta)[10];
272 名前:デフォルトの名無しさん [2007/11/07(水) 22:45:56 ] これだと関数の戻り値へのポインタなのか誰か関数とかまとめて void *func(void);
273 名前:デフォルトの名無しさん [2007/11/07(水) 22:51:54 ] 関数って配列にできるんですか
274 名前:デフォルトの名無しさん [2007/11/07(水) 22:55:31 ] 関数配列の戻り値へのポンタ int *ponta[10];
275 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 23:49:29 ] // 関数ポンタ配列 #include <stdio.h> typedef int (*pKANSUU)(int); int pontax0(int ponta){ return ponta-ponta; } int pontax1( int ponta ){ return ponta; } int pontax2(int ponta ){ return 2*ponta; } int main(){ pKANSUU ponta[3]; //int (*ponta[3])(int); ponta[0] = &pontax0; ponta[1] = &pontax1; ponta[2] = &pontax2; printf("x0: %d, x1: %d, x2: %d\n", (ponta[0])(100), (ponta[1])(100), ponta[2](100) ); return 0; }
276 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 23:55:36 ] なんか変なレスが混ざってるんだが、わざとやってるのか?
277 名前:デフォルトの名無しさん [2007/11/08(木) 00:00:13 ] なんか間違ってね?
278 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:05:54 ] >>270 の答えは何ポンタ?
279 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:06:44 ] 関数配列ってなに
280 名前:デフォルトの名無しさん [2007/11/08(木) 00:14:16 ] >>279 つ kannsuuhairetsu[] = {kannsuu0, kannsuu1, kannsuu2,......};
281 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:27:05 ] 関数ポインタって代入時の&と実行時の*ってなくても動作変わらないよね? もともとはどっちが正しいの?
282 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 01:06:42 ] 元々必要だったらしいが、gccがなんか理論武装して独自拡張として省略しても良くしたら、 世間に受け入れられたなんて話を聞いたことがある。
283 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 01:17:09 ] 余計ややこしくなった気もしますね
284 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 06:10:44 ] ジャンプテーブル
285 名前:デフォルトの名無しさん [2007/11/08(木) 06:50:19 ] 関数の戻り値へのポインタ void *func(void);
286 名前:デフォルトの名無しさん [2007/11/08(木) 06:52:01 ] 関数の戻り値の型が不貞の時は void func(void); で宣言していいんですか?引数が不貞の突起も?
287 名前:デフォルトの名無しさん [2007/11/08(木) 07:05:56 ] ://local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
288 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 07:49:01 ] >不貞の突起 なにやら面妖な…… 関数の戻り値型は一致しないといけません。まぁ、呼び出し側で値を使わないなら何でも構いませんが。 引き数に関しては、プロトタイプ宣言するなら一致している必要が出てくるのでなしと宣言したらなしになるので、 宣言したくないならなし(void)書いてはいけません。
289 名前:デフォルトの名無しさん [2007/11/08(木) 17:33:36 ] 教えてください。 void swap_ptr(char **a, char **b) { char *temp; temp = *a; *a = *b; *b = temp; } int main(void) { char *str_a = "ABC"; char *str_b = "123"; swap_ptr(&str_a, &str_b); printf("str_a=%s str_b=%s\n", str_a, str_b); return 0; } ↑のは正常に文字列の入れ替えが出来ます。 ならば void swap_ptr(char **a, char **b) { char *temp; *temp = **a; **a = **b; **b = *temp; } にしたら先頭の一文字だけ交換されるのか・・・と思ったら、交換されない上Warningまで出ます。 何がおかしいのでしょうか?
290 名前:デフォルトの名無しさん [2007/11/08(木) 17:35:09 ] さらに void swap_ptr(char **a, char **b) { char *temp; &temp = a; a = b; b = &temp; } にしたらコンパイルすらできません。この場合はaとbのスタック変数のメモリアドレスそのものを(物理的に)交換しようとしているからなのでしょうか?
291 名前:デフォルトの名無しさん [2007/11/08(木) 17:39:22 ] あ、>>289 はWarningは出ないけどコンパイル後実行させた時に >『問題が発生したため、a.exe を終了します。 ご不便をおかけして申し訳ありません。』 という致命的なエラーで落ちます。
292 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 17:41:14 ] >>289 の後者は、 void swap_ptr(char ** a, char ** b) {char temp = ** a; ** a = ** b; ** b = temp;} でないと辻褄が合わない。 そもそもchar * temp; だけではポインタは初期化されていないので、* temp = ...; とした場合不正アクセスになる。
293 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 17:41:18 ] 変数に入ってる具体的な数字をprintしてみればすぐわかる
294 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 17:42:52 ] 更に、>290のように&演算子を使った値は右辺値なので代入ができない。
295 名前:デフォルトの名無しさん [2007/11/08(木) 17:54:38 ] printしたらAが出ました。 printf("%c\n",**a);
296 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:03:22 ] アホかい。
297 名前:デフォルトの名無しさん [2007/11/08(木) 18:10:38 ] &str_aを引数で受け取った場合、 char **a; &a: ? a: ? *a: a配列全体を指すアドレス **a: aの実体(1文字) ローカル変数のスタックはどこにいった
298 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:13:38 ] &a: 文字列のアドレスのアドレス a: 文字列のアドレス *a: 文字列(文字配列へのポインタ) **a: 先頭文字
299 名前:デフォルトの名無しさん [2007/11/08(木) 18:14:52 ] >>292 その通りにやってもエラで落ちます・・
300 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:16:03 ] 違った、 *a: 文字列(文字へのポインタ)
301 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:19:16 ] &a: ローカル変数a自身のアドレス a: aの指すアドレス *a: aの指すアドレスの中身(文字配列全体)を指すアドレス? **a: aの指すアドレスの・・・?
302 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:31:24 ] まとめてみます これでなんでエラーが出るんでしょう。 #include <stdio.h> void swap_ptr(char **a, char **b) { char temp; temp = **a; **a = **b; **b = temp; } int main(void) { char *str_a = "ABC"; char *str_b = "123"; swap_ptr(&str_a, &str_b); printf("str_a=%s str_b=%s\n", str_a, str_b); return 0; } 予想される結果:str_a=1BC str_b=A23 現実:コンパイルは通るけど実行後何も表示されずに即エラー落ち
303 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:36:23 ] >>299 >292を使うには、main()でchar str_a[] = "ABC"などとしないといけない。
304 名前:デフォルトの名無しさん [2007/11/08(木) 18:38:19 ] str_a[0]='1';
305 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:51:37 ] >>303 む char str_a[] = "ABC"; (引数&str_a)もしくは char **str_a = "ABC";(引数str_a)で宣言すると 無事に"文字列"全体が交換されたんですけど、先頭文字だけでは無いんですね。何故か
306 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:53:48 ] いや、なんでもないです。>>305 は無視してください
307 名前:デフォルトの名無しさん [2007/11/08(木) 19:56:18 ] ポインタのポインタのポインタのポインタとか ヘンタイじみたモノは使うのを辞めましょう
308 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 20:16:36 ] 文字列リテラルを書き換えてはいけない
309 名前:デフォルトの名無しさん [2007/11/08(木) 23:51:48 ] >>305 どうでも良いけど、警告でねーか? 引数とわたす値の型が違ってるんだし 全体が交換されたからといって こんな間違ったポインタの使い方 なんの役にもたたねぇぞ
310 名前:デフォルトの名無しさん [2007/11/09(金) 00:27:30 ] void main() { (*************printf)("hello\n"); } これがコンパイルできるのはなぜですか? 気になって夜もろくに眠れません。 誰か教えて!!
311 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 00:31:10 ] 寝なくていいよ
312 名前:デフォルトの名無しさん [2007/11/09(金) 03:30:41 ] プ
313 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 22:13:25 ] void main() { (*************************************************************************************************************************************************************************printf)("hello\n"); } これも出来たから大丈夫
314 名前:デフォルトの名無しさん [2007/11/09(金) 22:16:57 ] local.joelonsoftware.com/mediawiki/index.php/Java%E3%82%B9%E3%82%AF%E3%83%BC%E3%83%AB%E3%81%AE%E5%8D%B1%E9%99%BA あなたが再帰アルゴリズムを数秒で書け、連結リストを操作するポインタを使った関数をホワイトボードに書くのと同じくらい早く実装できる大学3年生なら、私たちのニューヨークでのサマーインターンプログラムをチェックしてほしい! 申し込みの締め切りは2月1日だ。
315 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 23:25:03 ] つーかこれ通るんだから。 int main(void) { 1; return 0; }
316 名前:デフォルトの名無しさん [2007/11/10(土) 00:39:09 ] main(){ ('A') }
317 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:41:07 ] 懐かしい!!ポインタは面白いね char *s1, *s2; while (*(unsigned long long *)s2 = *(unsigned long long *)s1); この超ドSなコピーとかやってみ?ほんとハラハラさせてくれるよね
318 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:45:28 ] s2++,s1++するの忘れた ついポインタに目がいってしまいました
319 名前:デフォルトの名無しさん [2007/11/10(土) 01:52:25 ] main(){ ('A')マンドクセ }
320 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:02:52 ] ボインたん (;´Д`)ハァハァ
321 名前:デフォルトの名無しさん [2007/11/10(土) 02:21:33 ] (ポインタをメンバに持つ構造体)をメンバに持つ構造体へのポインタ あたりの自己参照構造体が難しいのですが・・・どうすりゃいいんだ〜〜〜〜
322 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:28:14 ] struct Node { struct Node *pNext; void *ptr; }; 自己参照構造体ってこんなんだっけ?
323 名前:デフォルトの名無しさん [2007/11/10(土) 02:31:10 ] こんなやつ 自己参照構造体が苦手でよくソフ開受かったな俺 typedef struct _person { int number; char name[40]; struct _person *prev; struct _person *next; } person; main() { prson *p; }
324 名前:デフォルトの名無しさん [2007/11/10(土) 02:34:46 ] メンバで「struct _person」を使う理由はまだ宣言されていないから 「struct _person」を「person」という省略名で宣言したいが、 メンバの定義段階では、「struct _person」は定義済みだが未だ「person」は定義されていないため 「struct _person」というダミーの名前を使わないとコンパイルエラーになるからって奴。
325 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:42:48 ] typedefとか使わなくていいんじゃないかと思う今日この頃 C言語は今でも struct _person { int number; char name[40]; struct _person *prev; struct _person *next; } ; main() { _person *p; } こういう書き方はだめなんだっけ?
326 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:48:13 ] >>325 だめ そいつはC++でしかできない
327 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:57:55 ] >>326 そうなんかd 最近「C言語で開発」とか言われても、開発環境がC++だから どこまでがCの仕様なのかわからなくなることがある
328 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:59:49 ] C++コンパイラ使ってベターCな開発するのはいいが、 その機能がCのものなのかC++のものなのかも理解して いないような香具師らもウジャウジャいるから気をつけろ。
329 名前:デフォルトの名無しさん [2007/11/10(土) 03:18:38 ] >>326 え??いいんじゃないの?
330 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 03:20:31 ] >>328 俺の事だ/(^o^)\
331 名前:デフォルトの名無しさん [2007/11/10(土) 03:20:49 ] >>326 あ、今試したらだめだった なんでダメなんだっけ?
332 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 03:24:53 ] structの部分も含めて「型」なんだって事じゃないの?
333 名前:デフォルトの名無しさん [2007/11/10(土) 03:26:19 ] つまり、main() { struct _person *p; } にしたらOKってことか
334 名前:デフォルトの名無しさん [2007/11/10(土) 03:59:01 ] ヌルポインター
335 名前:デフォルトの名無しさん [2007/11/10(土) 04:10:51 ] 以下のコードでコメントアウトをはずすとエラーが起こるのは何故ですか?? #include <stdio.h> int main(void) { char *p = "ABCD"; char *q; q = p; // q[1] = 'D'; printf("p = %s\nq = %s\n", p, q); return 0; }
336 名前:デフォルトの名無しさん [2007/11/10(土) 04:12:55 ] char p[] = "ABCD"; と宣言したら正常に動作した(ADCD)のですが、 なんでですか?
337 名前:デフォルトの名無しさん [2007/11/10(土) 04:13:26 ] ポインタは配列で操作出来るのでは
338 名前:デフォルトの名無しさん [2007/11/10(土) 04:17:07 ] ファミコンってC言語でプログラムされてるの? pc11.2ch.net/test/read.cgi/tech/1183559070/
339 名前:デフォルトの名無しさん [2007/11/10(土) 04:19:02 ] PS2の開発環境www.freescale.co.jp/codewarrior/products/game/ps2/index.html
340 名前:デフォルトの名無しさん mailto:age [2007/11/10(土) 04:55:07 ] あげ
341 名前:デフォルトの名無しさん [2007/11/10(土) 05:34:26 ] int readfile(LINE *hook, char *fname) { FILE *fin = fopen(fname, "r"); char stemp[256]; hook->next = hook->prev = hook; if(!fin) return 0; while(fgets(stemp, 256, fin)){ if(!(hook->prev->next = malloc(sizeof(LINE)))) return 0; if(!(hook->prev->next->str = malloc(strlen(stemp) + 1))) return 0; strcpy(hook->prev->next->str, stemp); hook->prev->next->prev = hook->prev; hook->prev->next->next = hook; hook->prev = hook->prev->next; } このコードを書いたのは誰だあッ! hook->prev->next->next とか hook->prev->next->prev とか(平気で書ける神経が)理解できねえ(笑) www.kt.rim.or.jp/~kbk/zakkicho/07/zakkicho0708b.html ■ げねれーた
342 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 06:49:28 ] >>335 "ABCD" は 暗黙の const char * だから。
343 名前:デフォルトの名無しさん [2007/11/10(土) 07:33:21 ] >>342 char p[] = "ABCD";とした時も暗黙のconst char * なのですか?
344 名前:デフォルトの名無しさん [2007/11/10(土) 09:11:30 ] ぬるぽ
345 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 10:14:42 ] >>343 それは本当の char p[] だわさ。 だから書き換えても大丈夫。 #include <stdio.h> int main(void) { const char p[] = "ABCD"; const char *q; q = p; q[1] = 'D'; printf("p = %s\nq = %s\n", p, q); return 0; } をやってみたら?
346 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 10:29:36 ] >>336 char配列の初期化には、例外的に文字列リテラルが使えるという決まりがあるから。
347 名前:デフォルトの名無しさん [2007/11/10(土) 10:36:20 ] >>345 普通に実行できた $ ./a p = ADCD q = ADCD
348 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 10:57:43 ] char *p = "ABCD"; は静的なところにある"ABCD"のアドレスをpに入れてるだけ って認識であってるよね?
349 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 11:17:54 ] cc -S a.c して a.s 読めば一目瞭然。
350 名前:デフォルトの名無しさん [2007/11/10(土) 11:28:17 ] >>349 流石に20代だから 流石にアセンブラなんて知りませんよ。流石に
351 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 12:50:43 ] >>350 いや。読むだけならアセンブラは簡単。 ポインタの理解にはアセンブラが、 オイラの持論だ。
352 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 17:36:57 ] アセンブラを理解するのには、ものすごく基本的な メモリとアドレスの事知る必要がある。 それがポインタを理解する上でも必要ってだけのことだ。 運転覚えるのにエンジン分解したいひとは、アセンブラからどうぞ。
353 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 17:44:32 ] 分解したくはないけれど、どんな気筒が幾つ、どんな風に配列されているかは知りたいぞ。
354 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 20:26:59 ] float f = 10.0f; int i = *(int*)&f; printf("%f %f",i,f); 結果: 10.000 10.000 ちょっと遊んでみるw
355 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 20:30:30 ] そのとおりだな。 アセンブラを知らないプログラマーは 自動車運転できるのにボンネットを一度も 開けたことの無い人に相当する。
356 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 20:38:34 ] 俺アセンブラ知らないけどあんまりポインタで困った覚えがない ボンネットはウォッシャー液が切れたら空ける
357 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 20:45:42 ] 学習のとっかかりとしてはいいけど、基本的に アドレスとポインタとは切り分けて考えた方がいいよ
358 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 20:47:07 ] ΩΩ Ω<ナ、ナンダッテー アドレスとポインタって違いを3行で
359 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 20:52:18 ] ポインタには(対象の型)という情報が含まれている。 アドレスと言う概念にはそんなものは全くない。 強いて言うなら、void * のようなもの。
360 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 20:54:12 ] ほんとに3行だw ありがとう
361 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 21:00:13 ] そもそも規格には、ポインタの値はアドレスであるなんて一言も書いてない。 ってほんと?
362 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 21:01:59 ] 普通に考えればそうだろ 変数を間接的に指し示してくれさえすれば用は足りるわけだし
363 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 21:13:08 ] >>354 うそだろ?
364 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 21:19:22 ] ポインタはアドレスを入れるための変数。 お茶碗とごはんの関係。
365 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:14:51 ] ポインタはただの変数だ〜
366 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:21:37 ] >>355 そのたとえで行くならば、IC やトランジスタ弄ったこと ない人も同じだな。
367 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:35:12 ] 物理化学やら量子力学を勉強してない人も(ry
368 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:39:11 ] 一人の人間の一生程度じゃどうしようもない範囲ですな
369 名前:デフォルトの名無しさん [2007/11/11(日) 01:31:28 ] 俺は頭がいいからなんとかなるけど 低収入のオマエラじゃ無理だな
370 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 01:40:23 ] >>369 はいはい、掲示板では何とでもいえるさw
371 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 03:08:02 ] >>341 実際こう書くこと多いけど何か問題でもあんの?
372 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 03:10:51 ] 読みにくいってだけじゃないの?
373 名前:デフォルトの名無しさん [2007/11/11(日) 03:15:32 ] >>371 ,372 まぁ論外だ。論外だということを理解できない君が、プログラマでない ことを願う。
374 名前:デフォルトの名無しさん [2007/11/11(日) 03:31:38 ] 残念
375 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 05:10:31 ] >>371-372 おいおい・・・
376 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 08:08:22 ] で実際なにがいけないの?
377 名前:デフォルトの名無しさん [2007/11/11(日) 09:51:13 ] 何故にポインタが存在するのか。これがわかれば楽勝
378 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 11:17:01 ] 俺は第一印象で、途中にNULLがあったらどうするんだ?って思ったが。
379 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 12:34:15 ] コーディングは暗号解読じゃねえんだ
380 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 12:51:28 ] いやぁ、コメントと改行とインデントがちゃんとしてれば 結構普通に読めると思うけど でもこれはポインタの話とは違くねぇ?
381 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 12:54:51 ] >>380 ポインタは普通の構造体に比べてコピーのコストかからないんだから 逐一名前を付け替えたほうが可読性あがるしそっちのほうが良かろう
382 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:10:43 ] 可読性はポインタには限らないじゃないってことを言いたかった
383 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:57:36 ] 英検準2級に落ちたああア
384 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 14:46:49 ] >>383 ポインタの問題でつまづいたか?
385 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 15:48:43 ] 中間ポインタを置いたほうが 読みやすいってことなの?
386 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 17:00:16 ] まず中間ポインタって何よ
387 名前:デフォルトの名無しさん [2007/11/11(日) 17:59:52 ] まぁ、C言語だと、短縮した記述とか、複雑なポインタの連鎖をつかって、 「俺、おまえらと違って頭いいんだよ」 と分り難いコードを得意げに自慢げに晒すヤツが けっこう居る
388 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:00:33 ] うん
389 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:07:30 ] 頭が良いことは良いことだ
390 名前:デフォルトの名無しさん [2007/11/11(日) 19:10:38 ] >>388 ,389 ソースコードの読み手が、「このコード大丈夫か?」とか 心配させるようなコード書くようなヤツは頭がいいとは言わない。 ソースコードの読み手が、立ち止まることなく「このコードは 大丈夫」だと確信しながら、スラスラ読めるコードを書くヤツは 頭がいい。 結論としては>>341 のようなコードを書くヤツは頭が悪い。
391 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:12:10 ] たいていの商品は分かりやすさこそ売り物の価値なんだよ。 高齢化社会を迎える日本だと特にそうだ。 戦後の日本文学が、難解であれば崇高だと勘違いして衰退してしまった反省を ソースコードにおいても生かしてほしいもんだ。
392 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:33:55 ] 同意ではあるんですが 読む人のレベルにもよりませんか?
393 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:37:09 ] >>390 うん
394 名前:デフォルトの名無しさん [2007/11/11(日) 19:52:45 ] >>392 もちろんプログラマとしての常識は、身につけている という前提は必要。 常識というのは、言語に関する知識、アルゴリズムに 関する知識、慣用句に関する知識くらいかな。パッと 思いつく限り。 あとは、プログラムが対象としている分野ごとの 知識は前提とするけど。例えば、デコーダのプログラム のソースコードならば、読み手がそのデコードの アルゴリズムを知っているという前提をした上で、 プログラムを書くことになる。
395 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:01:26 ] でも.Net Framework、SQL、XML、WebServices、などなど…。 色々ありすぎて、「言語に関する知識」「アルゴリズムに関する知識」という定義が やっぱり人それぞれになってしまうと思う。
396 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 21:04:45 ] >>395 それはどれも応用プログラミングの専門知識であって常識ではないんじゃないか。 現場の常識という事はあるかもしれないが、それでは一般論とはいえない。 ある範囲で分野を定義した時にその中の最低限の知識というのがあるわけで、 それ以上のテクニックだかノウハウだかを理由も無く濫用するのが良い習慣でないのは 間違いないだろう。
397 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 21:07:57 ] つうかそんな基本的なところで俺SUGEEやってないで仕事に集中しろよと
398 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:01:25 ] べた集中するための遊びだろ。 だいたい1:9ぐらいかな。
399 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 16:34:54 ] オ…オ…オレSugeeeee! …って思うもんさ、プログラマなら…
400 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:32:40 ] >>341 はただのポインタ連結だからいいけどさ、 これがC#のプロパティで同じことやられたりしたら、 もう理解不能だな。
401 名前:デフォルトの名無しさん [2007/11/13(火) 17:11:27 ] char dmoji[36][7][7] = { { " ##", " # #", " # #", " #####", " # #", "# #"}, { "##### ", " # #", "##### ", " # #", " # #", "######"}, { " ####", " ## #", " # ", "## ", " ## #", " ####"}, 。。。略・・・
402 名前:デフォルトの名無しさん [2007/11/13(火) 17:13:41 ] 464 名前:仕様書無しさん 投稿日:2007/11/13(火) 16:33:04 SEの兄がいつも独り言で死にたいあー死にたいってよく独り言を言ってます そんなに仕事は厳しいんですか? 465 名前:仕様書無しさん 投稿日:2007/11/13(火) 16:35:49 動かないものを動きますと言わないといけないからとか?
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聞いたら宣言の話だった、というのは無しにしてほしい。
504 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 18:00:50 ] 8進の0って表記では00じゃないの?
505 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 18:33:06 ] どっちでも一緒だからどうでもいいよ、ポインタと関係ないし
506 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:31:04 ] 世の中にポインタと関係ないものなんてないよ
507 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 22:59:05 ] Javaにはポインタは存在しないのに なぜ NullPointerException が出てくるんですか?
508 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 23:03:29 ] 語呂がいいから
509 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 23:12:29 ] >>507 ガッ
510 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 23:17:32 ] JavaにポインタがないこととJavaVMにポインタがないことは別だから。
511 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 18:22:20 ] ポインタがわからないという概念がわからない
512 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 20:19:17 ] 概念は分かるけど、使い方が難しい、使いどころが分からないってことなんだろう多分
513 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:54:11 ] 同じことをするのに何通りも方法があるのが混乱のもと。
514 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:38:36 ] だから、バカ用言語のjavaが出来たのだよ
515 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 02:53:01 ] 同じ著者?のExcelのVBAの本はわかりやすいのに こっちは結局よくわからんかった。著者はCを知らないっぽ www.amazon.co.jp/product/dp/4798011924
516 名前:デフォルトの名無しさん mailto: sage [2007/11/27(火) 13:53:19 ] Javaは単に見えなくしてるだけじゃないのか?
517 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 16:40:33 ] Javaは全部ポインタなのさ。
518 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 19:44:39 ] プリミティブ型はポインタがない。 かつ、オブジェクトでも明示的なアドレス演算ができないという意味では ポインタとしては不完全。
519 名前:デフォルトの名無しさん [2007/11/27(火) 21:33:49 ] ぷ・・・ぷれみあむがた?
520 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 21:37:37 ] アドレス演算なんかあってもしょーがない
521 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 00:47:47 ] しょうがないというかJavaにはその概念がないんだからできなくて当然だ。
522 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 01:33:43 ] できないからやれないのとできるけどやらないのとの間には越えられない壁がある
523 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 01:39:01 ] できないけどやるやつが始末悪い
524 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 07:01:35 ] 言語仕様上可能だからってやるやつも始末悪い
525 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 08:10:57 ] Cでは明示的なアドレス演算がないとプログラムが書けないだけのこと。
526 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 12:49:27 ] Cを10年やってきた俺が断言しよう。 ポインタのないC#が理想系にもっとも近い。 C++のように氾濫するライブラリを使いこなすためにキャストの嵐もないし。
527 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 13:05:36 ] 俺もそう思うー
528 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 13:10:45 ] C++を10年やってから言ってください^^
529 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 13:12:10 ] aho
530 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 14:18:08 ] C++も2〜3年はやってるがこんな扱いづらい言語はないよ。 自分で一から作るならいいけど、実際の現場じゃ色んな人が触ったソースも 見なきゃならないわけで、当然のように色んなライブラリが使われてる。 次から次へと覚えることが多すぎてヘボな俺の頭はついてけないぜ。 あとC++は文字列だけを見てもCString、std::string、System::String*、TCHAR*、WCHAR*、 CAtlString、BSTR、CComBSTRなどなど。おぞましいほど多様な形態がある。 C#だと、ほぼstring型で統一されてるだがなぁ。 C++は使い古されてもうカオス状態。言語としては何でもできる良い言語だけど 俺はもう嫌だ。ボスケテー
531 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 18:54:21 ] >>おぞましいほど多様な形態がある。 それはC++のせいではない。 そこの区別がつかないようでは(略
532 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 19:00:49 ] CLI(笑)
533 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 20:26:42 ] C++は
534 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 20:38:54 ] その中でC++の文字列型と言えるのはstd::stringだけじゃねぇ?
535 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 20:56:17 ] まぁ C++ は歴史も引きずってて自由でやり放題だからな… 自分でさらっと書くのには Java とかより楽で好きだけど、 他人のコードには手を入れたくないな。
536 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 21:32:12 ] おまえのも他人からそう思われてるよ 自分のが一番綺麗だと思ってるうちはまだまだ未熟
537 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 22:04:30 ] そういうカオス領域の扱いに長けているのがC++だと思っている。
538 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 22:28:55 ] >>536 別にきれいだと思っているとは書いていないよ。勉強して努力はしているが。 できるだけ自分で責任を持って直したいと思ってる。
539 名前:デフォルトの名無しさん [2007/11/29(木) 22:36:54 ] ポインタと関係ないですが
540 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 01:39:03 ] 趣味でオナニープログラムして楽しむならC++だな。 仕事では、使いたくねぇ
541 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 02:52:10 ] >>539 ポインタを語るスレではないからな そもそも学びたい奴がいないならこのスレいらんだろ ポインタがわからんやつとかいないじゃん
542 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 13:07:43 ] ポインタをどうやって学ぼうかってスレなんだから ポインタわかんない人も来るだろw
543 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 17:01:39 ] ポインタ勉強中でなんとなく面白くなってきた 関数は常に値渡し 参照渡しでも結局はアドレスと言う値を渡してるに過ぎない って認識であってる?
544 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 17:06:45 ] うん
545 名前:デフォルトの名無しさん [2007/11/30(金) 19:29:27 ] C言語は値渡ししかできない、でいいんですよね?
546 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 19:34:13 ] 今更Cやポインタなんて勉強してるやつはバカだろw 言語なんて勉強する意味がない。 コーダーは中国から買ってくれば良い
547 名前:デフォルトの名無しさん [2007/11/30(金) 19:38:14 ] そうして中国に追いつかれることに気付かない日本人。 私は自分のためにCやポインタを勉強する。
548 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 19:40:59 ] お前がバカなんだっつの
549 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 19:41:40 ] まともなコードが書けない奴が、まともな設計できるわけねえし
550 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 19:43:55 ] 他にも勉強する事が多くてなぁ・・・ まともなコードが描ける頃には髪の毛白くなってそうだよ
551 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 19:47:09 ] コード書きは全てに優先するんだよ 無知か?おまえ
552 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 19:48:00 ] なかなか粗悪な暇の潰し方だな
553 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 20:02:31 ] 職人みたいに低能頑固薄給視野0になりたければ コード書けばいいと思うがなw コーダーなんてインドから集めてくればいい
554 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 20:04:25 ] コーダ以外コード書く必要ないと思ってる化石か
555 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 20:05:04 ] マ板でどうぞ
556 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 21:20:07 ] GoogleやMSの社員もコード書いている件について
557 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 21:41:59 ] マネージャクラスでもな
558 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 21:43:34 ] それが普通
559 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 21:47:34 ] じゃあなんで日本のマネージャクラスはコード書かないのが多いの? なんで日本の文化ではコード書きは底辺がすることって信じられてるの?
560 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 21:52:06 ] typedef void* NULL; #define NULL 0
561 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 21:58:37 ] >>559 それが一番妥当かつ効率性が高いとう結果 なんだよ。結局コードなんて書いても成果を 出しましたって小細工しているにすぎないからな
562 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 22:01:24 ] 日本語で
563 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 22:07:28 ] >>556-558 書くモノしか見てないけど Google とか技術部いい感じだよね。 Norvig さんとか。
564 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 22:23:07 ] いい感じじゃねーだろ
565 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 22:39:04 ] 英語身に着けて外国でもなんでもいけばいい。 コードも書けない奴の言うことなんて誰もきかない。
566 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 22:49:30 ] 視野が狭すぎてすげーなw
567 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 23:08:53 ] 昔と比べてコードの抽象度が高いから、自然言語を使う必要性が減ったってことでしょ コーダにコーディングをアウトソースするときに、インプットとして「コード」が必要になったってこと 昔と大して変わってない
568 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 23:25:48 ] 今日帰りにインド人がやってるカレー屋に行ったんだけど、 カレー注文したらスプーンがついてこなくて 「あ、本格的な店なんだ」とか思って手で食ってたら、 半分くらい食ったときに、インド人の店員が奥から すげー申し訳なさそうな顔してスプーン持ってきた
569 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 23:34:53 ] >>568 おもしろいコピペがあったら貼るスレinマ板part4 pc11.2ch.net/test/read.cgi/prog/1194955716/l50
570 名前:デフォルトの名無しさん [2007/12/04(火) 15:03:58 ] >>128
571 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 17:44:08 ] >>128 が改悪したようにしか見えない件についてw
572 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 21:58:52 ] うおおぉぉ! Javaばかりでプログラム組んでいてC++にに戻ってきたらメモリ管理だるすぎて泣きそうだw Javaはメモリ管理が楽だからいいよな よくC#、Javaはポインタがなくて良いとか言う奴いるけど、これらの言語の利点はメモリ管理の楽さだろと突っ込みたいぜw それにC#、Javaはむしろポインタの固まりだしな C++のメモリ管理の経験があると、ガーベジコレクション等に負担をかけず高速なプログラムを組めることが身に染みてわかったぜ、自動解放だからってテキトーに組むとメモリリークは発生しないにしろ遅いなw 結論、C++のようなメモリ周りがシビアな言語をやる価値は今でも十分すぎるほどあると
573 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 22:40:35 ] C++ならスマートポインタ使えばいいのに
574 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 22:52:08 ] 違う違う。 C++ならスマートポインタ実装すればいいのに
575 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 07:28:30 ] 俺は、自分でメモリ管理しないと、不安でしょうがない。 JavaやC#だと、本当にリークしてないのか不安になってたまらない
576 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 13:56:30 ] aho
577 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 15:47:48 ] GUIでガベコレの遅延がはっきり感じられるとつらいね 元々もっさりなのに時々かくかくではストレスもたまる
578 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 16:24:29 ] なんでそうなるコードを書くの?
579 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 17:21:57 ] リソース管理が自動化されてる言語しかやったことがない、とか
580 名前:デフォルトの名無しさん [2007/12/13(木) 16:16:38 ] int array[10]; で&arrayってvoid*?
581 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 16:52:14 ] int**
582 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 17:04:52 ] 自己レス int (*)[10]か。 >>581 あれ?それでもいいの? 試してみます
583 名前:デフォルトの名無しさん [2007/12/13(木) 17:13:53 ] 配列のポインタと、ポインタのポインタを間違えるな
584 名前:582 mailto:sage [2007/12/13(木) 17:24:09 ] int**はダメだた・・・
585 名前:デフォルトの名無しさん [2007/12/13(木) 17:32:46 ] >>572 俺にはC++のメモリ管理がだるいと感じるお前が理解できない new したらdeleteすればいいだけじゃん なにがだるいんだか・・・
586 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 17:36:05 ] それがだるい。
587 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 18:31:19 ] >>585 C++のメモリ管理ってスマポンタだろ
588 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 18:33:31 ] >>580 配列名だけで先頭要素のアドレスになる。 ただし、それは変数じゃないので&を付けても無駄。 int array[10]; printf("%p¥n", array); printf("%p¥n", &array); で試してごらん。
589 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 18:34:41 ] >>586 よきにはからえ、じゃないと駄目だよね。 ゆとりプログラミングの時代さ。
590 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 19:24:19 ] >>588 arrayは配列の先頭要素へのポインタ &arrayは配列へのポインタ だから値は同じだけど意味が違うんじゃないですか?
591 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 19:51:16 ] >>589 コンパイラ使うのも似たような言葉で馬鹿にされたものだけどね。
592 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 21:53:28 ] >>588 違う。 arrayはポインタでは「ない」。 ポインタは変数。配列名は定数。
593 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 21:57:39 ] 単にarrayと書いたときに「どう解釈されるか?」の話じゃないの?
594 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 22:11:13 ] アレーイ?
595 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 23:43:50 ] アルェーイ?
596 名前:デフォルトの名無しさん [2007/12/14(金) 10:44:32 ] 配列とポインタは違うのに同じだ、 と言うニュアンスでK&Rで解説されたために、 その後のC言語の入門書で、 よく分ってないヤツがゴチャゴチャにして説明するようになって、 今に至る
597 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 11:49:52 ] 基本的に違うけど引数としてはどっちでもとれるって状況 だと思うが引数として使うってのが けっこうメジャーな使いかたなためごっちゃになってるって 状況だとおれは認識してる。
598 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 11:55:35 ] >>597 >基本的に違うけど引数としてはどっちでもとれるって状況 間違い。 引き数としては、常にポインタ。 # 但し、Cの場合。
599 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 12:36:31 ] 学校で課題で「配列とポインタの違いを説明せよ」みたいなのあったなぁ・・・
600 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 16:41:13 ] >>585 自分がnewしてdeleteするなら別に面倒では無いだろうけど リスト構造でなおかつ、その構造が要素追加にnew、削除にdeleteを使うようなプログラムはが何万行と続くとデバック作業がかなり面倒だろ?まあ、それはそれで利点もあるがな それを面倒臭くないというお前はすごいな、それとも極小規模なプログラムしか組んだことないのかな?
601 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 17:58:01 ] >>599 配列は箱を列に並べたもの ポインタは矢印 でいいかな?
602 名前:デフォルトの名無しさん [2007/12/14(金) 18:43:34 ] >>601 大学のレポートって、お絵かきでOKなの?
603 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 18:59:17 ] >>598 そういうことじゃなくてポインタ変数でも配列変数でも 代入できるだろうって意味。
604 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 19:25:33 ] 住所そのものと住所を書いた紙が別なのは当たり前だろが 住所そのものを変えるには市町村合併でもするほかないが紙に書かれた住所を書き換えるだけなら簡単
605 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 19:31:58 ] >>604 なんかオブジェクト指向の例え話なみに微妙な話だな
606 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 19:50:48 ] たとえ話に住所って言葉を使うのが間違ってそう
607 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 19:54:39 ] ポインタなんて [C言語 ポインタ完全制覇] 読んで理解したなら 後は、実践を繰り返すだけだろーよ
608 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 19:56:31 ] どんなに微妙でも人間の脳構造はアナロジーの利くものの方が 覚えやすくできてんだからそれでいいじゃんよ。
609 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 20:05:30 ] C FAQの6.13 www.kouno.jp/home/c_faq/c6.html#13 c-faq.com/aryptr/ptrtoarray.html に ・・・本当に配列そのものへのポインターが必要な場合は「int (*ap)[N];」 のような表現を使う。 ここでNは配列のサイズを表す(質問1.21も参照)。 配列の大きさがわからない場合、Nを省略することができる。 しかし 結果として得られる「大きさが未知の配列へのポインター」は役に立たない。 ってあるんですが、 int array[10]; int (*ap)[]; ap = &arrrayってエラーにならないんですか?
610 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 20:17:14 ] >>609 配列の不完全型ってヤツか? 良く分からんが、違う構造体同士で相互参照する時なんかに使う 構造体の不完全型の親戚みたいなもんかな
611 名前:デフォルトの名無しさん [2007/12/15(土) 02:27:42 ] >>609 試せば良いじゃんよ
612 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 02:32:55 ] VC++ExpressEdition d:\work\vc\array\arrayptr.cpp(9) : error C2440: '=' : 'int (*__w64 )[10]' から 'int (*)[]' に変換できません。 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
613 名前:デフォルトの名無しさん [2007/12/15(土) 04:19:56 ] Cより先にアセンブラやれ!! アドレスの概念を理解しないでいきなりやるから 難しくなるんだよ!!
614 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 05:35:26 ] それも極端な話だなあ、と思う反面確かにそれが近道だよなあと思っているおれがいる
615 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 08:55:36 ] ちょっと疑問なんだが、配列自体が先頭のアドレスを示しているのに、 さらにそれのアドレスが欲しい場合ってどういうケース?想像つかないんだけど。
616 名前:デフォルトの名無しさん [2007/12/15(土) 10:40:49 ] こんな感じなら理解できるか? #include <stdio.h> #define N 5 void aryfunc(int ary[N][N]) { int *temp; for(temp = &ary[0][0]; temp != &ary[N-1][N]; temp++){ (*temp)++; } } int main() { int ary[N][N] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}, {16,17,18,19,20},{21,22,23,24,25}}; int *temp,i; for(temp = &ary[0][0],i = 1; temp != &ary[N-1][N]; temp++,i++){ printf("%d ",*temp); if(!(i%5)) putchar('\n'); } aryfunc(ary); for(temp = &ary[0][0],i = 1; temp != &ary[N-1][N]; temp++,i++){ printf("%d ",*temp); if(!(i%5)) putchar('\n'); } return 0; }
617 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 12:08:10 ] >>616 添字でアクセスできるのに、わざわざポインタつかってわかりにくくしてる気がするんだが。 ↓と同じことでしょ? void aryfunc(int ary[N][N]) { int i, j; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { ary[i][j]++; } } }
618 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 12:11:15 ] >>615 配列の配列とか、配列の配列の配列とか、つまり多次元配列を 関数の引数として渡すときに必要だな
619 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 12:15:46 ] >>615 配列名は、配列の「先頭の要素」のアドレス。 配列名に&をつけた場合は配列「そのものの」のアドレス。 ポインタの値としては同じ値だが、意味が違う。 なんか思い違いをしてる気がするぜよ
620 名前:615 mailto:sage [2007/12/15(土) 12:48:40 ] >>618 多次元配列も、型と先頭アドレスと要素数を何らかの形で渡せばいいわけだから、 アドレスに関しては配列名のみを渡せばいいんじゃないの? >>619 意味の違いは理解してるつもりだが、これじゃなきゃできない、というケースが思いつかなくてさ。 先頭の要素のアドレスと、配列そのもののアドレスが違うことがあれば理解もできるってもんだが…
621 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 13:12:30 ] &つけようがつけまいが 値同じだから意味は同じ しょうもねー議論してるんじゃねーよw
622 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 13:22:07 ] そんな乱暴なw
623 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 13:54:30 ] >>621 型が違うから意味は違うだろ
624 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 14:29:01 ] >>621 おまい、ポインタはvoid*さえあればいい派だなw
625 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 14:51:34 ] void *と void **あれば何もいらねーだろ。 型に束縛される書き方してると 汎用性失う言語だし 携帯のドライバなんかは int Inithoge(void * data1, void *data2, void *data3) こんなの普通だぞ?
626 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 15:01:07 ] 携帯用のドライバなんかどうでもいい
627 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 15:42:40 ] www.kouno.jp/home/c_faq/c6.html#18 >>配列の配列は、ポインターへのポインターに成り下がることはない。 これを読んで思ったんだけど、 int main(int argc, char **argv)は間違い(行儀が悪い)で、 int main(int argc, char *argv[])が正しい(行儀が良い)の?
628 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 16:43:52 ] >>627 関数の引数は常にポインタしかとらない。 字面上配列の形をしていても、そいつはポインタだ。 だから、 void foo(char *pa[]); void bar(char **pp); char aa[10][10]; という関数と配列の配列があったとして、以下の呼び出し foo(aa); bar(aa); のどちらも違法(コンパイラが怒る)だ。 これが「配列の配列は、ポインターへのポインターへ成り下がることはない」の意味だ。 ちなみにmainに渡されるargvはポインタの配列であり、これはポインタのポインタで受けられる。
629 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 18:02:39 ] argvがポインタの配列だから void hoge(char str[])を void hoge(char *str)と書けるのと一緒で int main(int argc, char *argv[])を int main(int argc, char **argv)って書くのは全然おかしくないわけか。 むしろ後者の方が実際にやっていることとイメージが近いな。
630 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 18:45:17 ] const char* const argv[] って書きたいところだけど
631 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 06:01:17 ] ポインタの配列と、配列の配列の違いを、 いくら説明しても全く理解できないヤツ、 会社に一人くらいいるよな・・・ プロのプログラマーのはずなのに
632 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 06:05:55 ] ・ポインタを「何かを指している矢印」 ・配列を「何かが入っている箱」 という図を描いてみて、その上で配列の配列とポインタの配列を描いてみればすぐわかると思うんだけどな。
633 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 11:13:25 ] >>631 専門書籍で使われてる言葉をそのまま使っても伝わらないよ 一度日本語に直す、相手に伝わる言葉に直す そういうリファクタリングを繰り返してバカ矯正プログラムが完成するんだ
634 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 16:47:55 ] ダブルポインタと呼ぶのはやめてほしい
635 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 17:07:40 ] 図ばかり頼りにして、言葉を大事にしないのは、理系プログラマの欠点だ
636 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 21:45:05 ] 文章から何かをイメージする能力が読む側に備わってない 理系文系だ関係なく読解問題が苦手なの増えてるだろ? だからこっちでイメージを用意してやりようやく相手が理解できる マンガと同じだわ
637 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 22:15:45 ] そうゆうこと 嫌韓を読めばよくあの国が理解できるのと一緒
638 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 22:49:12 ] 嫌韓って漫画じゃねえよあれ。カット集じゃん 全編挿絵っつうか
639 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 23:05:44 ] マジレスすること自体 ゆとりだと自己主張しているものだな。 このスレ削除でよくねーか?
640 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 23:08:20 ] 時々思いがけない議論があってちょっと楽しいから 削除しないで放置しておいて欲しい
641 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 23:13:43 ] マジレスでもなんでもないだろw どんどん話題が枝葉にそれてるだけで
642 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 00:08:20 ] まず、学ぶべきことを定義するのが先じゃないか? アドレスの代入、アドレスが示す値の参照 関数へのアドレス渡し ポインタを利用するアルゴリズムを理解 こんな感じでさ
643 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 00:14:32 ] レス600過ぎてから定義されてもwww
644 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 01:39:57 ] 老いて益々盛んってことわざもあるし 人生に手遅れって言葉はないと思うんだ
645 名前:デフォルトの名無しさん [2007/12/17(月) 04:57:57 ] w w
646 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 11:54:52 ] 図に書いて説明するより、ソースレベルデバッガでポインタ変数にどんな値が入って、 その値が指すアドレス(とその前後アドレス)にどんな値が入ってるのか 見せた方が分かりやすいと思う。
647 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 12:32:54 ] >>646 ポインタの実際の値がいくつなんて、 どうでもよいことじゃね?
648 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 17:17:05 ] ポインタをsizeofすると正体がわかるよね 32bitの処理系なら型に限らず全部4だし
649 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 18:12:01 ] >647 いや、そういう正体のつかめ無さが、初心者には分かりづらいんじゃない? まずは抽象度を下げて、具体例から入った方がいい。
650 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:20:39 ] >>648 ただそんなことに頼っていると書いているコードがしばらくたって 使おうと思うと動かなくなる。
651 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 23:40:06 ] ポインタは単純だ for (int i = 0; dst[i] = src[i]; i++); がポインタのおかげで for (; *dst++ = *src++;); できるだけだ
652 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 23:59:44 ] あまり違わない気がする・・・
653 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 02:16:14 ] つか、C++使い始めてからポインタなぶるなんて中々無くなったわ
654 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 02:48:13 ] 関数での受け渡し以外にポインタなんて使う?
655 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 03:51:26 ] mallocなどで確保するときに使うよ
656 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 09:50:06 ] 文字列だってポインタじゃん
657 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:39:02 ] >>654 自己参照型構造体使ってないのか?素人さん?
658 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 20:34:35 ] 玄人さんがお見えになったぞ!
659 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 20:48:28 ] ポインタ使うのに、玄人も素人もない
660 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 23:03:10 ] グローバル変数の初期化順序が保証されてないから、初期化順が重要な グローバルオブジェクトはポインタだけ定義しといて、初期化関数で順番に newしていくとか。 (順序が重要なオブジェクトをグローバルにすることの是非は置いといて)
661 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 01:03:25 ] >>654 オブジェクトいろいろ弄る時に使うよ。入れ替えたりとか便利。
662 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 01:33:28 ] コールバックするのにつかうー longjumpするのにも使う
663 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 01:43:57 ] もう「無いと困る」でいいんじゃね?
664 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 01:51:40 ] >>657 データ格納するならデータベース使わね? 組み込みなら、一時的な(親機に渡す日次処理で消えてしまうよな)データの格納に使ったりするけど 今は組み込みもDBの採用が進んでるし
665 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 01:55:29 ] それとこれとは話が違う・・・
666 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 02:02:54 ] 話が違うというか、本物が来ちゃったようだ・・・
667 名前:デフォルトの名無しさん [2007/12/19(水) 02:37:02 ] ポインタ使って2−3木を作りたいと思っているのですが ここを見ればおkていうサイトとかありませんか?
668 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 08:24:16 ] データ構造とアルゴリズムを扱った書籍を買った方がいいと思うね
669 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:32:47 ] てか作ればいいじゃん
670 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:48:42 ] 自己参照構造体というのを試してみたんだが、メモリの開放が面倒そうだ。 自分を指してる一つ前の構造体のアドレスってどうやって取得するの? 元々そういう風に構造体を作らなきゃダメ?↓みたいな感じで。 typedef struct tree { struct tree *prev; struct tree *next; int x; } tree_t;
671 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:51:29 ] 駄目
672 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:59:19 ] 自分は初期の頃はtree->next->nextでNULL見つけてtree->nextを解放したら, tree->nextをNULLにする.ポインタ最初に戻してまた上から見るみたいなことやってたw 双方向だとその辺ずいぶん速くなるよね.
673 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:32:57 ] >>672 再帰すればいいじゃん。
674 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:44:48 ] >>672 うん,いまは順方向だけの場合そうやってる. 順j方向リストの場合サーチかけてるポインタじゃなくて その次に対して操作すると一つ前のアドレスはサーチかけてる ポインタそのものになるということをいいたかった.
675 名前:デフォルトの名無しさん [2007/12/19(水) 12:56:15 ] >>668 >>669 わかりました、頑張ります!
676 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:35:02 ] おまいら、1方向の線形リストならもっとうまい手があるだろうが。 あるノードを消す場合は、その後ろのノードを消すノードに上書きして、 後ろのノードをfreeするんだよ。
677 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 17:35:31 ] 一方向の線形リストなら「上書き」って必要ないでしょ 消すノードの前のノードと後ろのノードを繋げてから 対象ノードをfreeすればいいんじゃないの
678 名前:676 mailto:sage [2007/12/19(水) 17:39:23 ] 1方向って*prevがないやつか ごめんなさい
679 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 17:39:55 ] おれ677だった ごめんねごめんねごめんね
680 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 17:56:32 ] >>679 許すからキニシナイ。 真面目な話、あるノードを消したければ後ろのノードの内容を上書きして後ろの方の ノードを消すなんてのは一方向線形リストを扱う時の基本的なアルゴリズムだよ。 先頭からまた検索するなんて、無駄無駄無駄〜! じゃ、あるノードの前に新しいノードを追加する時はどうすれば無駄がないか 考えてみそ。
681 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 19:19:59 ] ポイントを押さえて学ぶべき
682 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 19:57:24 ] 2次元配列を渡すときに大きさが分からなくて void hoge(int array[][SIZE])見たいな書き方ができないときは void hoge(int* array[])か void hoge(int** array)で書くしかない?
683 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:00:19 ] 動的確保してポインタへのポインタで渡す
684 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:19:36 ] 動的静的関係なくね?
685 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:22:04 ] 渡す側がサイズを知らないってどういうこと?
686 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:26:19 ] よくあること
687 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:30:01 ] >>682 また、ポインタと配列がゴチャゴチャになってしまって分からないヤツがきたな
688 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:30:38 ] 受け取る側が渡す側からサイズを教えてもらえないと、2次元として扱うのは無理なのだが
689 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:31:15 ] 番兵くんがいればそうとも限らない
690 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:40:50 ] もう、なんでもかんでもvoid*で渡して、 後は、渡されたほうの関数の中で好きにすれば、 なんでもOKだ
691 名前:682 mailto:sage [2007/12/19(水) 20:46:15 ] int sum(int** array,int i_size,int j_size){ int sum=0; for(int i=0;i<i_size;i++) for(int j=0;j<j_size;j++) sum+=array[i][j]; return sum; } a[3][4],b[10][20]が宣言されてたとして、 上の関数ならsum(a,3,4)もsum(b,10,20)も実行できるけど *じゃなくて[]を使おうとすると大きさ分からなくて困るじゃん… と書こうとしたんだが、静的配列じゃ動かないのなこれ。 いろいろ勘違いしてたすまん。
692 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:49:02 ] malloc()したときに確保した要素数わかってるんだから、 それを関数に渡せばいいだけだと思うが。 要素数を教えないで、どうやって終端を認識するの?
693 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:58:44 ] void hoge(int **ary, int m, int n) { /* ごにょごにょ */ } int main(void) { int **ary; int m, n, i; /* m, nに配列長を代入 */ ary = malloc(m * sizeof(int *)); for (i = 0; i < m; i++) ary[i] = malloc(n * sizeof(int)); return 0; } こういうことじゃないの?
694 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 22:23:32 ] 配列でもポインタが扱える では無く、むしろ 配列はポインタで処理される と考えるんだ
695 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:33:27 ] つか、STL使えよって話だよな
696 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 20:29:52 ] OTLもなかなかいいよ
697 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 20:36:39 ] ポインタの壁に挫折した人みたい
698 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 04:26:47 ] いろいろ書いて実行してみること。 アセンブラしてたからかな?すぐ理解できた。
699 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 09:21:28 ] 今からポインタ学ぼうって人が「じゃあアセンブラからやろう」って思う訳が無い
700 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 12:01:32 ] アドレス変換テーブルの話なんか聞かされて よけいわけわからなくなっちゃったような奴なら じゃあアセンブラからやろうと思うんじゃないか
701 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 14:13:17 ] やる気さえあればすぐ覚えられる 最長でも1日悩み抜けば覚えられるレベル 厄介なのは、すぐ意気消沈してしまう性格
702 名前:デフォルトの名無しさん [2007/12/22(土) 03:07:15 ] ** をポインタのポインタなどと訳する事で余計に初心者の理解を妨げてるように感じる。
703 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 03:11:39 ] じゃあなんて
704 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 03:29:18 ] ポインタ(変数|オブジェクト|インスタンス)へのポインタ
705 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 03:34:15 ] ようするにポインタへのポインタじゃないか
706 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 11:26:22 ] pointer to pointer 「の」は適切じゃないかもな
707 名前: mailto:sage [2007/12/22(土) 11:26:53 ] ポインタ変数を型とするポインタとか
708 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 11:35:30 ] >>707 わけわからん
709 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 12:45:55 ] toに引きずられてるアホども
710 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 13:05:50 ] ポインタとポインタでいいじゃん 2こ仲良くていいじゃん
711 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 13:36:43 ] int x = 1, *px, **ppx; px = &x; ppx = &px; printf("%d %d %d", x *px, **px);
712 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 13:54:03 ] >>711 いいたいことは判るが > printf("%d %d %d", x *px, **px); printf("%d %d %d", x, *px, **ppx);
713 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:32:04 ] 「ポインタのポインタ」と聞いて、その本質と真意を理解できないおまえらは、頭悪い。 100の言葉をもって、最初から最後まで全てを語りつくさないと理解できないのか?
714 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:04:33 ] 初心者にとっては解りにくいって話が、どうしてそうなる?
715 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:10:02 ] それは誤解 言葉がわかりにくいんじゃないんだよ
716 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:10:08 ] ポインタのポインタ の検索結果 約 4,450 件中 1 - 10 件目 (0.02 秒) www.google.co.jp/search?hl=ja&q=%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF ポインタへのポインタ の検索結果 約 2,600 件中 1 - 10 件目 (0.21 秒) www.google.co.jp/search?hl=ja&q=%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%B8%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF ダブルポインタ の検索結果 約 2,430 件中 1 - 10 件目 (0.21 秒) www.google.co.jp/search?hl=ja&q=%E3%83%80%E3%83%96%E3%83%AB%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF
717 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:15:03 ] char *cp; を「charのポインタ」って言うんだから、 void **pp; を「ポインタのポインタ」って言ってもいいじゃないか。
718 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:20:44 ] うん
719 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:23:48 ] 俺char *は「charへのポインタ」と言っているよ。
720 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:25:29 ] >>717 ポインタ=何かを指す=指向性のあるもの。よって、 char *cp は「char型へのポインタ」 void **pp は「void型へのポインタへのポインタ」
721 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:27:03 ] うん
722 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:28:10 ] >>720 それでもいいけどね、「へ」は無くてもいいんだよ。
723 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:35:02 ] >>720 型は指してないんじゃね?
724 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:43:12 ] 俺も意識して 「〜のポインタ」とか「関数ポインタ」とかじゃなくて 「〜へのポインタ」って言ってる
725 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:48:16 ] それでも通じるからいいんじゃね
726 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:48:18 ] 「へ」は重要だ。「へ」があることによって、何かを指してると認識できる。 「〜のポインタ」だけだと意味が通じない。 …ということを言いたかった。
727 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:48:59 ] いや「へ」はなくても通じるんだよ
728 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:53:22 ] そもそもポインタって何かを指すものじゃん
729 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 17:32:03 ] 初心者にとって、という話だろ?「へ」はあったほうがいいよ。 既に理解してる人にはどっちでもいい。
730 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 17:38:55 ] 初心者にとっても有っても無くても同じ。
731 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 17:56:14 ] じゃあvoid ***pppはなんていうの? char ****cpppはなんていうの?
732 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 19:01:12 ] そんなものは出てきてはいけないw
733 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 19:53:13 ] ___ ━┓ / ―\ ┏┛ /ノ (●)\ ・ . | (●) ⌒)\ . | (__ノ ̄ | \ / \ _ノ /´ `\ | | | | ___ ━┓ / ― \ ┏┛ / (●) \ヽ ・ / (⌒ (●) / /  ̄ヽ__) / . /´ ___/ | \ | |
734 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:38:12 ] 「への」に1票
735 名前:デフォルトの名無しさん [2007/12/22(土) 22:39:37 ] >>731 void ***pppやchar ****cpppなんて使う機会ない
736 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 02:26:02 ] へ へ の の も へ
737 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 04:23:45 ] >>731 初心者がそんなもの使うかアホ 極論に持って行こうとするなよボケ
738 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 13:59:37 ] ダブルポインタでええやん。
739 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 14:23:10 ] じゃあダブポで
740 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 14:23:33 ] ゾッ
741 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 02:33:11 ] **のまま使ってる時点でほとんどクソコードだろ。 ふつうtypedefにするかstructにいれる。
742 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 09:29:32 ] いやいや、ある構造体の領域をヒープから確保する関数の場合とか、 **を渡した方が自然な場合もある。
743 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 13:07:01 ] どうせならデュアルポインタのほうがかっこよくね?
744 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 14:07:43 ] クアッドポインタにオクタポインタっすね
745 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:19:37 ] ポンタでよくね?響きが萌える
746 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:22:22 ] ポイポインタ
747 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 20:46:28 ] つ[*&]
748 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 21:01:54 ] ポインヨ
749 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 22:06:00 ] >>745 あのjunkyのおっさんですか?
750 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 00:05:43 ] ツインポインタ
751 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 00:39:04 ] ポインポイン
752 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 00:40:28 ] ポインティングゥー!ポインタァー!!!
753 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 02:17:22 ] 日本語でいいだろ。「二次ポインタ 」
754 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 02:42:06 ] 「ポインタ」も日本語にしろ
755 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 02:46:15 ] 刺す人
756 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 02:46:48 ] そういわれればポインタの日本語訳って見かけないね イテレータは反復子と訳されるのに
757 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 02:55:56 ] じゃ、「二次指示子」
758 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:59:17 ] ポインタの和訳は…そうだな…「オブジェクトリファレンス」ってのはどうだい?
759 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:35:43 ] 参照じゃねーかw
760 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 05:40:44 ] その前に突っ込むところがあるだろw
761 名前:デフォルトの名無しさん [2007/12/27(木) 07:59:20 ] ポインタはウルトラマンセブンに出てくる乗り物だよ
762 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 13:16:11 ] ウルトラマンのやつは「ポ↓イ↑ン↑タ↓ー↓」 コンピュータ用語のほうは「ポ↑イ↑ン↓タ↓ー↓」
763 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:43:31 ] 違うだろ。
764 名前:デフォルトの名無しさん [2007/12/27(木) 16:35:25 ] 和訳なら矢印だな
765 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:19:45 ] int *ip int* ip ptr<int> ip 1番目より2番目の方が、2番目より3番目の方がわかりやすいと思うんだけどどうよ。
766 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:26:25 ] どうといわれても
767 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:42:59 ] ポインタ宣言子と間接参照演算子が別の記号だったら混乱起こさなかったのに。
768 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 19:10:47 ] C++のスマートポインタはその点で気が利いてる。 Cだと表現しようがないんだけど。
769 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 19:54:56 ] いまさら宣言の記法に注文つけてどうなる。
770 名前:デフォルトの名無しさん [2007/12/27(木) 20:27:21 ] 宣言の記法に注文付けたい奴は typedef int* intptr; とでもしやがれってんだ。 こんな事してるソース見たことはないが でもwin32apiのソース読むと typedefしまくりで、あんぐりする。
771 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:54:56 ] int* p, q;
772 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:47:44 ] int q, *p; これと>>771 が等価ってのはひどい。
773 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:47:47 ] >ポインタのポインタ ハンドル…。
774 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 06:51:30 ] >>773 昔のMac以外にそういう呼び方をする流儀ってあるのか
775 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 07:22:09 ] >>774 別に流儀じゃなくて、一つのメモリ管理モデルとしてあるわけで。 (MacOSに影響受けているから当然と言えば当然だけど)PalmOSでもハンドルで管理していたし。
776 名前:デフォルトの名無しさん [2007/12/29(土) 12:23:49 ] string使えはええやん。
777 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 13:04:32 ] は?
778 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 16:26:01 ] CPUエミュレータ作るとき、関数ポインタの配列を使いまくった。
779 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 06:19:59 ] クラスのメンバ関数の宣言にvirtualを使用すると関数ポインタになる件に関して クラスの変数の初期化が面倒だからmemset(this,NULL,sizeof(*this))でうっかりvirtualを含むクラスを初期化してしまうと実行時エラーにw
780 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:19:27 ] あたりまえやん
781 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 01:12:26 ] >クラスの変数の初期化が面倒だから そういう用途にはmemset使うなってエロイ人が言ってたよ。
782 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 19:58:20 ] memsetなんてもうずーっと使ってないなー
783 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 20:01:49 ] >>779 >memset(this,NULL,sizeof(*this)) ここでNULL使うのはおかしくね?
784 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:14:45 ] そもそもmemset()使うのがおかしいからどうでもいいよ。
785 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:47:58 ] www.kijineko.co.jp/tech/superstitions/initialization-by-memset.html >局所変数、特に集成体を宣言した後、実際に必要かどうかに関わらず、必ず memset でゼロクリアする人は大勢います。 >しかし、そんなコードを見かけたら、それを書いた人のコードはすべて疑ってかかった方がよいかもしれません。
786 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:55:34 ] 構造体単体でもmemsetする奴は危険だよ
787 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 23:03:41 ] 別にmemsetそのものは危険じゃないよ。
788 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 23:09:05 ] する奴は って書いてある
789 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 23:10:03 ] うん、そうだね。書いてあるね。 でもそんなことは関係なしにmemsetそのものは危険じゃないよ。
790 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 23:12:30 ] ポインタと全然関係ない話題ですねw
791 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 23:17:06 ] struct A a; memset(&a, 0x00, sizeof(struct A)); もう馬鹿かとw こんな後に if( a.hoge != NULL) とかやってる奴ちょっと来い ぬっこしてやるから
792 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 23:20:21 ] 勝手にすればぁ〜
793 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 05:16:33 ] 局所変数の初期化って不要なの? struct { int a; int b int c; } data; struct data; data.a = 0; とやったとき、bとcには何が入っているのか確定してる?
794 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 06:47:12 ] もちろん不定
795 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 07:40:39 ] >>793 スレ違い。まぁ、そもそもコンパイル通らないだろうからどうでもいいけど。
796 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 09:06:04 ] 構造体を初期化するのにmemset()を使わないなら、memset()なんて何に使うのさ? そもそもゼロクリアなんていらねーよ、って話?
797 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 10:27:06 ] >>796 そもそも NULL == アドレス0 って保証はないわけなんだが
798 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 11:20:52 ] >>797 メンバにポインタが含まれる構造体の話か。でもそれなら、 struct DATA data[10] = {0}; という書き方も正しい保障は無いということになるよね。どうすりゃいいの?
799 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 12:05:18 ] ={0} は正しい。memsetでゼロクリアするのとは異なる。
800 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 12:14:52 ] >>799 >>797
801 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 13:42:40 ] >>800 void *p = 0; などとしたとき、p はアドレス 0 を指すわけじゃないぞ。 定数 0 は処理系依存のヌルポインタのビットパターンを作り出す。 struct DATA data = {0}; は、構造体 DATA の各メンバを 定数の 0 (ビットパターンが 0 なわけではない) で初期化するから、大丈夫だよ。
802 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:47:35 ] 釣られすぎ
803 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 22:09:46 ] なるほど、釣りだったということにしたいわけか
804 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 22:26:20 ] ヌルポ インタ
805 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 00:41:13 ] >>804 ガッ
806 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:46:21 ] 今はVSでクラスなんかをガシガシ使ってるから使わないけど、 一昔前にUNIXで開発してた頃はstructでデータ構造を設計して、 使用時には memset(&data, 0x00, sizeof(data)); などのように初期化してから使う、というのが常套句だったよ。俺は。
807 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 15:09:53 ] はい、スレの皆さん 新年特別DQN >>806 入りました〜 かわいがってやってください。w
808 名前:806 [2008/01/14(月) 17:20:45 ] ■データ構成 #define DATAMAX 255 struct { struct { int code; char name[16]; } table[DATAMAX]; } data; ■初期化 memset(&data, 0x00, sizeof(data)); ■DB等からセット for(i=0; i<DATAMAX; i++) { data.table[i].a = a; data.table[i].b = b; } ■取得関数 char empty[16]; char *getName(char *code) { for(i=0; i<DATAMAX; i++) return data.table[i].name; return empty; } ■使用 strcpy(name, getName(code));
809 名前:806 [2008/01/14(月) 17:21:05 ] >>807 かなりはしょってるが、上のレスのようにやってた。 DQN?俺がDQN? 他人に頼らず、テメーだけの力で批判でも何でもしてみろや。 他力本願な口だけ野郎。
810 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 17:35:52 ] コンストラクタで初期化してメンバは隠蔽した方がいいと思う
811 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 17:53:10 ] 【虎の威を借る狐】 他人の権勢に頼って威張るザコのたとえ
812 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:12:21 ] >>809 本当にそんな汎用性のないキモイおもちゃ作り ずっとやってたの?w 取得関数とかクエリ合わせてチューニングも 選択もできねーしこんな設計じゃ拡張性もない ゴミすぎるだろw?
813 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:24:30 ] >>806 WindowsAPIのほとんどは今もそうだね
814 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:46:28 ] >>809 DQNかどうかは兎も角、>808を書いている時点でお郷が知れている。
815 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:53:08 ] やっぱり>>806 は痛い奴だったか そんな臭いがプンプンしたしなぁ 反論してみ?
816 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:58:26 ] お前のかあちゃんデベソ
817 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:59:35 ] きさまっ!いってはならないことをぉおぉぉおおおお
818 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 00:06:55 ] 環境や用途によってやり方は違うだろうに「キモイ」って評価しちゃう奴はある意味スゲェと思う。
819 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 00:23:30 ] >>818 OSS宗教様達は多いよ リーなんちゃらという変態指導者の 影響だろうけど 自分達の受け入れたくないコード=グロ って定義だし。
820 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 00:35:04 ] 実際見たら、グロなんだろ。
821 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 01:31:10 ] グロいものほど美味い。これは定説です。
822 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 07:03:52 ] ポインタ使った事無いから事故にならなかったんだろ。 こっそりやってるなら、どうせわからないからいいけど、 堂々と自慢されると、やっぱりな、あれだよ・・・
823 名前:796 mailto:sage [2008/01/15(火) 09:15:50 ] よーするに、memset()は使い道が無いってことかい?
824 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 10:40:09 ] >>823 環境依存でもよくて、標準の真っ当なコードに較べれば多少は速いかもしれないコードを使いたくて、 Intrinsicが用意されていないか使えなくて、インラインアセンブラが用意されていないか使えなくて、 他の手段が見つからないか、過去の遺物を使う為に必要。
825 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 12:05:51 ] とりあえず書いとけば誰かが直してくれるさ
826 名前:808 mailto:sage [2008/01/15(火) 14:26:44 ] まともな反論は>>812 くらいか。 かなりはしょってて共通の関数なんかをすべて省いてるから>>812 の感想はもっともだけど、 実際の事務処理アプリの現場ではその「キモイおもちゃ作り」とやらが蔓延していたのもまた 事実としてあるんだから、自分だけ高みから見下して一蹴してしまうすような>>812 は、俺には 少し世間知らずに見えてしまうな。 >>815 「やっぱり」ってなんだ? テメーで反論せずに誰かに反論してもらって「やっぱり」って思ったの? まさに>>811 に出てる「虎の威を借る狐」=ザコだなお前。 あと「反論してみ?」って見下してるけど、テメーは何も言ってないよねw なんなんだお前は〜w
827 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 14:27:45 ] こんなネタで盛り上がれるお前らの時間の贅沢な使い方に脱糞
828 名前:808 [2008/01/15(火) 14:31:40 ] このスレ、極少数は経験も知識も豊富っぽいのがいるかも知れないけど、 その他はザコばっかだね。しかも性格が悪すぎ。 >>806 に対しての>>807 は何だ。 知識も経験もないけど一方的に悪口言ってストレス解消ですか? 反論したいならテメーでしろ。 できないなら実のある話しろやボケ。 だから過疎るんだよこの板。
829 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 14:33:00 ] うん。
830 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 15:49:25 ] 血圧が高いんじゃない? 高血圧は万病の元だよ。 まじで心配
831 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 17:50:03 ] >>828 で、ちみはポインタの何がわからなくて躓いてるんだ?
832 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 18:12:13 ] ポインタとmemsetって関係なくね?
833 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 18:19:10 ] もとは、ポインタをビットパターン0にしちゃだめだろ、って話だったけどな。
834 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 19:26:38 ] >>810 といい、>>816 と>>817 の自作自演といい、ガキが多いのは感じる ゆとりって言葉は嫌いだけどつい使ってしまいそうな程
835 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 19:31:55 ] memsetの話出てからこのスレつまんなくなった
836 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 19:48:20 ] どこまで行けば面白くなるのか遡ってみたら>>1 に到達してしまった
837 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 19:51:28 ] >>834 とか>>828 あたりで十分面白いだろ。
838 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 21:15:09 ] 結局memsetで初期化することの問題点は、 浮動小数点数やポインタの内部表現が環境依存であるから 0.0やNULLに初期化されるとは限らないということだけ?
839 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 22:02:23 ] >>838 そだよ つか, memset なんて組み込みやるときの bss の初期化にしか使った事ねぇし…
840 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 12:36:15 ] 某A賞のシステムでもそんなの誰も気にせずmemsetしてるけどな
841 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 13:14:03 ] Cでgotoは絶対に使ってはいけない、という神話に似てる
842 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 13:51:46 ] >>835-837 m9(・∀・)自作自演だろ!! 違うかな? たぶん>>816-817 と同一人物と見た。もしこの推測が合っていたら、 おまいは姑息で卑怯なこざかしい人ですね
843 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 14:04:59 ] まじで病院行け。
844 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 14:44:02 ] 835は俺です 他は違います
845 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 15:18:02 ] 頭のおかしい人にマジレスしてもw
846 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 09:28:36 ] __,. -─-- 、_ , - ' _,´ --──‐- ) ,イ´__-___,. -‐ '__,. - '´ `ー----, - ' ´ ̄ `` 、__ __,ィ ヽ. `ヽ. , '⌒Y / 、ヽ ヽ ヽ. / / i /l/|_ハ li l i li ハ . // 〃 /l i|j_,.//‐'/ lTト l、l j N i | {イ l / l li //___ リ_lノ lル' lハ. ソ ___◎_r‐ロユ i| /レ/l l l v'´ ̄ , ´ ̄`イ !| ll,ハ └─‐┐ナ┐┌┘ _ ヘ____ ハ| ll∧ハヽ ト、 '''' r==┐ '''' /l jハ| ll ll /./┌┘└┬┘└┼────┘ロコ┌i 〃 ‖ レ'¨´ヽiへ. _ 、__,ノ ,.イ/|/ ノ ll l| </  ̄L.l ̄ ̄L.lL.! ┌┘| ll ll { ⌒ヽ_/ } ー‐<.__ ′ l| ‖ ‖ ‖ ヽ, /、 〈 |:::::::| `ヽ ‖ ‖ {. ハ ヽ Y`‐┴、::::v l ‖ ‖ |iヽ{ ヽ_ゾノ‐一’::::ヽ. | ‖ ‖ |i:::::`¨´-- :::......:...:.:.::.}| ‖ ‖ |i::::::ヽ._:::_:::::::::::::::::::_ノ | ‖ ‖ |i::::::::::::i___:::::::::::/ | jj::::::::r┴-- `ー‐ '⌒ | 〃:::::::マ二 _,ノ //::::::::::::i ー 一 '´ ̄::. ,','::::::::::::::i::::::::::::::::::::::i::::::ヽ
847 名前:デフォルトの名無しさん [2008/01/18(金) 13:58:42 ] ぴぴるぴるぴるぴぴるぴ〜
848 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 16:55:30 ] memsetだってwin32api使ってたらよく使うし まぁ、ようは、どんな関数でも使う奴しだいだろ
849 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:05:01 ] ほとんど見かけないようなプラットフォーム向けにも移植性を確保しておきたいかどうかだな zlibみたいなライブラリではそうする価値があるかもしれないが、俺が書くようなコードではどうでもいい…
850 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:27:36 ] >>849 スピード命のコードだと, 内周ループで数エントリの構造体を memset するのってやたらコストがでかい。 実際には、サブルーチンコールのオーバーヘッドがでかいんだが… 去年 MPEG 関連の仕事を途中から引き継いだんだけど、とろくって 使い物にならなかった元のコードの memset を代入文に変えただけ で実行時間 60% 程度まで短くなった。
851 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:35:04 ] それは使っているコンパイラが悪いような希ガス。
852 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:35:30 ] >>850 memset初期化を使うのは、システム起動時か、再起動時でしょ。 あとはオブジェクトが生成されたときとか。 頻繁に生成、破棄を繰り返すようなオブジェクトで、システム上重要な パフォーマンスに影響をあたえるものにたいして、memset初期化をするかしないか というのは「高速化」の話。memset初期化のよしあしの話ではない。
853 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:35:42 ] >>850 まぁそれはまた別の話かと
854 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:54:00 ] >>851 それは言えてるんだが、組み込み物ではコンパイラの選択肢は限られる。 ましてや、クライアント指定のコンパイラだ >>852 > システム上重要なパフォーマンスに影響をあたえるもの に、対して memset で初期化しておいて、直後にその大半を意味のある 値で再度上書きしてた。 > よしあしの話ではない。 かもしれないが、元のコードを書いた奴の神経をうたがったわな。
855 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:57:38 ] Win32APIみたいに設定項目が山のようにあり、 常に全部を使うわけでもなく、 0で埋められる項目の頻度が高ければ十分ありだろ。 C/C++以外では今時クラスインスタンス0フィルされる言語も珍しくもないし。 ケースを指定するでもなく一般論としてあーだこーだいってる奴はアフォ。
856 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 23:11:50 ] >>855 いいえ。 高が、struct someStruct foo = {0} で済むことのためにmemset()を使う必然性は殆どありませんね。 それがstruct someStruct * foo = malloc(sizeof(* foo))した領域でも同じこと。
857 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 23:29:25 ] memset使わないで struct someStruct * foo 何か処理 foo = {0};って感じでまた初期化すればいいだけ memset使うやつは馬鹿今の公開されている まともなソースでmemset使ってるのコードは皆無だぞ?
858 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 23:31:27 ] >>857 >foo = {0}; それ無理じゃね
859 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 23:38:01 ] 0fillがいかんからmemsetがいかんに話がずれてきてるな
860 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 23:38:59 ] パフォーマンスだけに限って言うと、memsetをインライン展開するコンパイラなら使う事もある。
861 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 23:50:15 ] >高が、struct someStruct foo = {0} で済むことのため 宣言と同時に初期化しない場合はどうするの? というよりこれってコンパイラ依存なんじゃないの?
862 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 23:51:49 ] memsetは危険だから使うなって manとかMSDNに記述あるんだな
863 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 23:54:46 ] >>862 具体的に書いてくれ。調べるの面倒
864 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 23:55:37 ] お前は何を言っているんだ
865 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:05:01 ] manページより: >説明 >memset() は s で示されるメモリ領域の先頭から n バイトを c で埋める。 >返り値 >memset() は s へのポインタを返す。 >準拠 >SVr4, 4.3BSD, C89, C99, POSIX.1-2001. 俺の目がおかしいのかもしれないが危険性がどこにもみつけられない。 MSDNとか読むきしないから他のヤツよろしく。
866 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:09:13 ] >memset() は s で示されるメモリ領域の先頭から n バイトを c で埋める。 これは嘘だろw nバイトをcで埋める可能性もあるが正解
867 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:10:50 ] >>866 日本語でおk
868 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:13:06 ] 冬 真 っ 盛 り
869 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:15:43 ] 埋めない可能性もあるのか? まぁSEGVるかもしれんが
870 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:18:25 ] >>869 >まぁSEGVるかもしれんが >>866 がそんなことで「埋めない可能性がある」とかバカなこというわけないじゃないか。 >>866 は、きっともっと違った根拠があっていってるのだよ。
871 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:19:58 ] ECCメモリを使っていない場合に起こるのかもしれないなw
872 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:27:17 ] >>871 ワロスwww その「可能性」言い出したら、マニュアルなんて書けない気がするがwww
873 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:28:46 ] 釣り堀だなw
874 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:35:45 ] >>867-873 こんなに釣れた
875 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:40:41 ] >>874 トイウコトニシタイノデスネ
876 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 12:18:16 ] struct someStruct foo = {0} これはできるけど、動的確保した構造体だと無理じゃね?
877 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 12:21:34 ] >>876 C99は可能 お前あほ杉w
878 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:00:41 ] >>876 struct someStruct * foo = malloc(sizeof(* foo)); struct someStruct blank = {0}; * foo = blank; よほど気の利かないコンパイラでもなければ、blankの実態は作られない。
879 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:06:25 ] なんと言う糞コードというか糞スレ・・・
880 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:14:39 ] >struct someStruct blank = {0}; こんなコンパイラがサポートしている「かもしれない」機能を 「使わないのはおかしい」と主張されてもな。
881 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:20:18 ] >コンパイラがサポートしている「かもしれない」機能 そうなの?
882 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:21:52 ] >>880 サポートしていないコンパイラをご存知ならご提示くださいませ。 以後規格外品として、広く存在を知らしめてまいりたいと思いますので。
883 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:22:15 ] >>881 そうだよ
884 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:23:16 ] >>882 むかし使ってた、ARMの純正コンパイラではサポートされてなかったな。
885 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:23:35 ] >>882 組み込み業界じゃザラにあるが…
886 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:24:52 ] もし論点があってそれを覚えているのなら3行にまとめてくれたまへ
887 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:26:15 ] つまり、昔のARM純正コンパイラは構造体の初期化ができないと?
888 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:26:47 ] >>884 , 885 つか、>>882 は「Cが処理系に依存しない高級言語だ」って 思ってる可愛そうな奴なんだよ
889 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:28:01 ] >>887 いや、全部のメンバに代入すればOK struct A { int a; int b; }; OK:struct A a = {0, 0}; NG:struct A a = {0};
890 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 15:42:06 ] お前らまずは日本語を学べ スレタイが読めるようになったらまた来い
891 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:37:52 ] ポインタは友達!
892 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 21:53:40 ] ポインタ「げ。また>>891 だよ・・・マジウザイ・・・
893 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 01:38:56 ] ひでえw
894 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:51:06 ] 昔記事を見て馬鹿にしてた教材が一番わかりやすかった
895 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 22:18:11 ] memsetを使う利点は使い方によっては構造体の初期化のソースを短く出来る事かな 巨大な行列を持つ構造体を初期化するとか普通に代入でまかなうとマジで馬鹿にならないくらいソースが膨らむから ループで回して初期化するのも遅いしな
896 名前:デフォルトの名無しさん [2008/01/21(月) 00:52:45 ] Cプログラマ必須テキストです! mori.eco.to/
897 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 01:23:47 ] >>896 どうでもいいのだが・・・ >当然ですが、あらゆる標準関数の使用を認めません。 > >・strlen() を自作せよ。 >・strcat() を自作せよ。 標準関数の使用を認めないくらいなら、strlenとかstrcatとかキケンな 関数じゃなくて、ふつうはもっと安全な代替関数を自作するでしょ。
898 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:16:15 ] >>896 >C++未経験ながら、1人でC++の10万行のソースコードの保守及び、3万行の開発を行った。 これ単にCとして使ったとかじゃ
899 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:38:15 ] いまどき行数で規模示すなんて クラス数と各クラスのメソッド数で競ってくれ っつーかすれ違いか
900 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:57:11 ] 競うなよ。どっちも少なければ少ないほど良い。
901 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 05:07:32 ] さすがにクラスは適切な数ってのがあるだろうな。
902 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 11:28:41 ] >>896 は宣伝でマルチしてるから無視すべし
903 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 17:02:57 ] PIC等の単純なCPUで機械語でもやってアドレッシングモードを習えば ポインタは理解出来るんじゃね? 余計に混乱するかな?
904 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 18:50:37 ] PICとかアドレッシングモードとかわけわかめなんだけどどうすれば習えるの?
905 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 19:33:40 ] PICは余計なところが気になりすぎ、16ビット以上推奨だな。 AVRとかHC08とかARMがいいんじゃね? あと、アセンブラのアドレスはせいぜい指してる先のバイト数 の情報くらいしか持ってないから、ポインタまでには、まだまだ 壁があるのでよろしく。
906 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 20:47:32 ] >>895 おれは構造体を定義したら、必ずその初期化関数を作るけどな。 だからソースはさほど膨らまない。 まあその関数の中でmemsetをやっている場合もあるんだが、 それでも素のmemsetは使わないな。
907 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 21:43:28 ] 動的にその行列のサイズが変わる、その平均が100X100から1000X1000近くになって 最悪5千近くなる行列は動的に変わるんで代入じゃ無理だし、ループでまわして初期化するよりはmemset使った方が速度は確保できるし 何が糞なんだかなぁと思うわw まあ、動的に確保して中身をゼロクリアしたいのならcalloc使えって話だけどなw しかし、途中で初期化したくなったらmemsetかな?
908 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 22:09:00 ] >>905 > あと、アセンブラのアドレスはせいぜい指してる先のバイト数 > の情報くらいしか持ってないから TRON chip を否定したな!WwwWW
909 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 22:47:17 ] >>908 > TRON chip を否定したな!WwwWW は? TRON Chipのポインタも、持ってる情報はアドレスだけですが? ポインタに情報を持たせるのはLisp処理系とかで、ワードアラインの都合で 使わない下2bitに型の情報を入れ込んだりとか、アドレスが24ビットだった 68000用のやっぱりLisp処理系で上8bitに型の情報を入れたり、とか。 ポインタが本格的に(?)型の情報を持ってるアーキテクチャったらIBMの System/38→AS/400とかだろ。
910 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:12:54 ] >>909 ショボいCPU使ってプログラムを作ると自分でポインタを作って管理しなきゃいけなくなるよ。 それでポインタがマスター出来るだろうと思う。
911 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 01:11:14 ] >>907 そういう0クリアする必要があるときのmemsetには、誰も異論を唱えていない。
912 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 01:16:18 ] >>907 それやるとどこか1バイトだけ 初期化されず危険というコンパイラもある
913 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 01:24:46 ] >>912 「そうする機能を持つ」ということと、「バグでその機能が働かない」というのを ごっちゃにすると、ワケワカンナクなるからやめようぜ。