ポインタはどうやって学ぶべきか

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
なんと!意外にもスレが無かったので立ててみました

先日のソフトウェア開発技術者試験午後UのB木のポインタ表現
近年の基本情報技術者試験の午後C言語問題の自己参照構造体
など物凄く出来が悪いです。

ゆとり?文系?自作減少?
ブラックボックス化されてメモリ管理やコンピュータの細かい知識が不要となった?

本当にポインターは必要なのか!?議論しましょう
2デフォルトの名無しさん:2007/10/24(水) 04:08:11
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
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デフォルトの名無しさん:2007/10/24(水) 04:15:50
作ってわかるCプログラミング(著:日下部)のポインタでつまづいてオワタ\(^o^)/
9デフォルトの名無しさん: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デフォルトの名無しさん:2007/10/24(水) 07:41:51
どうでもいいけどCのポインタの記法はキショい
13デフォルトの名無しさん:2007/10/24(水) 07:54:11
int *p;
int* p;

どっちの書き方します?
14デフォルトの名無しさん:2007/10/24(水) 07:58:27
後者は素人
15デフォルトの名無しさん:2007/10/24(水) 08:14:55
int i, *ip;
って書き方を考えると前者。

C++だと後者かな。
16デフォルトの名無しさん:2007/10/24(水) 09:08:21
C だと int *p; C++ だと int* p; と書いている。
17デフォルトの名無しさん:2007/10/24(水) 09:09:52
そのネタでしか伸ばせないならもう終わろうぜ
18デフォルトの名無しさん:2007/10/24(水) 10:13:31
じゃあ次はモナドはどうやって学ぶべきかで頼む
19デフォルトの名無しさん:2007/10/24(水) 11:14:13
ポインタ理解できない人は、メモリにデータが配置されるってことを
「紙の上」でのみ理解してるんだろうね。
20デフォルトの名無しさん:2007/10/24(水) 11:21:39
理解できてる人は何で理解してんの?
やっぱイケてるC使いは実際にアセンブリ言語でメインメモリいじくっちゃったりしてたんスかね?
21デフォルトの名無しさん:2007/10/24(水) 11:26:07
メモリ配置がうんたらより
単純に演算子がややこしいだけ
22デフォルトの名無しさん:2007/10/24(水) 11:26:31
アセンブリで書いていたこともあるけど、あんまり関係なくないか。
やっていればそりゃあメモリのイメージを掴むのに有利かもしらんけど。

とにかくなんかメモリの塊があって、そこを指している矢印があって、
その矢印がポインタだというイメージでいいんじゃないの。
23デフォルトの名無しさん:2007/10/24(水) 11:28:33
無能なマの馴れ合いはマ板でやれ

ポインタ厨へ。ポインタは糞。イラネ。
http://pc11.2ch.net/test/read.cgi/prog/1140086684/
24デフォルトの名無しさん:2007/10/24(水) 11:28:48
>>20
いや、ワンボードしかなかった時代に、コンピュータをいじり始めたから、分かるだけなのだが...。
25デフォルトの名無しさん:2007/10/24(水) 11:32:10
間接参照表現にキャストする演算子だと思えばいいんでねえの?
26デフォルトの名無しさん:2007/10/24(水) 12:30:22
ttp://japanese.joelonsoftware.com/Articles/Interviewing.html

どうやら大部分の人々はポインタを理解するための脳の一部分を持たずして生まれてくるようだ。
ポインタの理解はスキルではなく、才能の類である。
ポインタの理解にはインダイレクト且つ多重に関連付けを行う論理的思考が要求され、
どうあがいてもそれが出来ない人だっているのだ。
27デフォルトの名無しさん:2007/10/24(水) 14:42:26
俺なんかポインタのポインタを扱えるようになるのに10年かかった。
28デフォルトの名無しさん:2007/10/24(水) 15:06:14
>>27
例えばstrtol()みたいな関数も使えなかったわけですね?
29デフォルトの名無しさん:2007/10/24(水) 15:56:49
>>28
ポインタのポインタを使った処理を思い通りに(納得行くかたちで)組めるようになるのに10年てこと。
30デフォルトの名無しさん:2007/10/24(水) 16:00:00
>>20
Cでvramをレイプしてました
31デフォルトの名無しさん:2007/10/24(水) 16:39:28
関数の呼び出し方が分かったら、なぜポインタが必要かわかる
32デフォルトの名無しさん:2007/10/24(水) 17:35:48
ポインタへのポインタが分からないと
2次元配列の動的確保さえできないんだよな…
33デフォルトの名無しさん:2007/10/24(水) 17:53:02
34デフォルトの名無しさん:2007/10/24(水) 21:00:11
アセンブラを学べばポインタも身につくってホント/ウソ?
35デフォルトの名無しさん:2007/10/24(水) 21:13:39
ポインタはランダムアクセスイテレータ
36デフォルトの名無しさん:2007/10/24(水) 22:40:29
>>34
ハンドアセンブルなら完璧。
37デフォルトの名無しさん:2007/10/24(水) 22:53:52
ポインタ、面白いと思うんだけどな。
38デフォルトの名無しさん:2007/10/25(木) 12:09:52
39デフォルトの名無しさん:2007/10/25(木) 12:10:49
>>37
その面白さを若い奴らにどう伝えていくのか
技術の継承もおじさん世代の役目
40デフォルトの名無しさん:2007/10/25(木) 13:23:34
ポインタなんか要らないと言う話
http://homepage3.nifty.com/mogami/diary/d0710.html#242
41デフォルトの名無しさん:2007/10/25(木) 17:09:55
ポインタ厨へ。ポインタは糞。イラネ。
http://pc11.2ch.net/test/read.cgi/prog/1140086684/
42デフォルトの名無しさん:2007/10/25(木) 18:41:27
C言語のポインタの文法はおかしい
http://pc8.2ch.net/test/read.cgi/tech/1115419223/
43デフォルトの名無しさん:2007/10/25(木) 19:04:09
ポインタを知らないと、参照渡しと値渡しの違いが分からないだろ
逆にその違いが分かればポインタも分かる
44デフォルトの名無しさん:2007/10/25(木) 19:08:18
想像力のない奴め、教えてやるよ。
それは、ポインタという形にしてアドレスを意識しなくてもプログラミングできるようになったから
C以降にプログラマになった奴はアドレスを意識する必要性に迫られなかったからだ。
覚える必要がないから覚えなかった。だから理解できなかった。そういうことだ。
45デフォルトの名無しさん:2007/10/25(木) 19:22:27
ポインタ役たつけどなぁ
46デフォルトの名無しさん:2007/10/25(木) 19:30:01
ポインタを安全にした仕組みでできなくて、ポインタでできる有益なことってなにかある?
47デフォルトの名無しさん:2007/10/25(木) 19:34:23
連結リスト
48デフォルトの名無しさん:2007/10/25(木) 19:36:20
ダブルポインタ
49デフォルトの名無しさん:2007/10/25(木) 20:04:42
>>47
ノードオブジェクトがほかのノードオブジェクトの参照を持つ、ではだめか?

>>48
オブジェクトがほかのオブジェクトをもって、そのオブジェクトがまたほかのオブジェクトを持つ、じゃだめか?
50デフォルトの名無しさん:2007/10/25(木) 20:09:46
ポインヨはランダムアクセスイテレータの実装の一つです
51デフォルトの名無しさん:2007/10/25(木) 21:23:23
C言語をいくらやっても分からず、アセンブラを学んだとき
ドミノが倒れるように全てを理解した
あの感動を体験したいならまずC言語からやるのだ
メモリやアドレスの定義もない、入門書からやるのだ
これは数学と似ている。
集合も論理学も教えない。だからクラスの誰も分からない
大学に入って初めて秘密を知るのだ。


まあ無駄なのでアセンブラからやれ
52デフォルトの名無しさん:2007/10/25(木) 21:56:23
>>51
CASLUでもいいですか?試験の為に本買ったんですが、Cの勉強(学校)が忙しくて放置したままです。
53デフォルトの名無しさん: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デフォルトの名無しさん:2007/10/26(金) 13:00:09
ポインタよりもC++の参照がよく理解できない
57デフォルトの名無しさん:2007/10/26(金) 13:25:33
>>56
俺も。
一回参照設定したら変更できないのが参った。
ポインタの変り種だとおもったんだけど違うらしい。
58デフォルトの名無しさん:2007/10/26(金) 17:16:59
>>55
パソコン買えば漏れなく付いてくるx86系の方が実効性は高い
59デフォルトの名無しさん:2007/10/26(金) 21:42:30
>>56
C++の参照は、constなポインタ。
変数宣言時、関数の引数、コンストラクタの初期化リスト内でしか
値を初期化できないように制限してある。
ポインタには、大きなデータのコピーを避けるための"共有"の意味と
配列等で個々の位置を表すための"イテレータ"としての意味とがあるけれど、
後者は使い方を間違えると危険だから前者しかできなくなっているということ
60デフォルトの名無しさん:2007/10/26(金) 21:57:09
参照は正直、std::stringやstd::listを渡すときくらいしか使わんな
なんとなくポインタだと不自然だから参照で渡してる感じ

>>46
とあるメモリー上のデータの塊を、プログラマの都合で「違う解釈の仕方で読む」ことができるのが魅力
当然スピードを気にしなければJavaとかでもできるが、スピードの劣化が一切無くできるのがポインタの魅力
61デフォルトの名無しさん: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デフォルトの名無しさん:2007/10/27(土) 12:10:18
>>59
へーへー
俺もC++の参照よくわからんかったのでもっぱらポインタで代用してたけど
こういう意味だったのね
65デフォルトの名無しさん:2007/10/27(土) 12:34:46
>>60
> 参照は正直、std::stringやstd::listを渡すときくらいしか使わんな
> なんとなくポインタだと不自然だから参照で渡してる感じ

俺はむしろ逆だな。ポインタとしての機能を必要としない限り参照
(あるいは値)で渡す。安全第一だからね。
66デフォルトの名無しさん:2007/10/27(土) 16:20:28
>>65
大抵shared_ptr使っちゃうからなぁ
67デフォルトの名無しさん:2007/10/27(土) 21:46:05
>>66
boost は俺も結構使うけど、あまり必要無いときは使わない。
参照で OK なのにわざわざ boost 持ち込むとかはせん。
68デフォルトの名無しさん:2007/10/28(日) 10:04:33
69デフォルトの名無しさん:2007/10/28(日) 11:45:20
アセンブリ言語から始めよう
70デフォルトの名無しさん:2007/10/28(日) 11:50:55
俺はこれでそれなりに理解した気分になった
http://www.gihyo.co.jp/books/syoseki.php/4-7741-1142-2
まだ買えるのかは知らない
71デフォルトの名無しさん:2007/10/28(日) 14:19:45
ポインタは特定の場所をポイント、だから!指差すものだと何度いったら。。。
72デフォルトの名無しさん:2007/10/28(日) 16:10:45
なぜポインタを理解できないのかが理解できないから、教えようがないんだよねえ。
73デフォルトの名無しさん:2007/10/28(日) 16:16:43
POD型の動的な多次元配列をポインタを使って実装するなら問題ないけど
テンプレートメンバ関数ポインタを引数に取る関数のポインタの配列のポインタ
とかなると意味わからなくなるんだけどこれは理解できてないからだな
74デフォルトの名無しさん:2007/10/28(日) 16:53:27
ポインターをうまく言い表す日本語が鍵だな
75デフォルトの名無しさん:2007/10/28(日) 17:43:50
>>61
C++ の参照渡しは、
int &p で宣言した関数に対して
呼び出し側では普通に int を渡すのが混乱した。
76デフォルトの名無しさん:2007/10/28(日) 17:46:13
c++ の場合は定義の際は & つかうくせに実際に呼ぶときは
普通に呼べるのは便利だが、混乱の元でもあるね。
77デフォルトの名無しさん:2007/10/28(日) 17:58:23
つーか。参照渡しを表す & とアドレス演算子を表す & に
同じ記号を使うように決めたデザインがド間抜けに一票。
78デフォルトの名無しさん:2007/10/28(日) 18:02:34
ポインタもポインタで定義の際に*使うくせに
実際に呼ぶとき*をつけると中身が出てくる謎仕様
宣言と間接参照演算子が同じってだけで、結局は慣れなんだけどね。
79デフォルトの名無しさん:2007/10/28(日) 18:28:25
>>78
int *p;
ってのは、「*pがint型」という意味でそのような仕様にしたらしい。
80デフォルトの名無しさん:2007/10/28(日) 18:51:16
呼び出し側のソースを見たとき値渡しなのか参照渡しなのかわからないから参照嫌い
81デフォルトの名無しさん:2007/10/29(月) 01:52:21
単純な8bitCPUとかPICとかのアセンブラを学んで見ると良い。
アセンブラで登場する各種のアドレッシングモードを理解出来れば
ポインタなんてそれほど難しいもんじゃないよ。
82デフォルトの名無しさん:2007/10/29(月) 18:48:11
Ruby使え
83デフォルトの名無しさん:2007/10/29(月) 19:36:22
>>79
おお、なるほど。そう説明されればわかりやすいな
84デフォルトの名無しさん:2007/10/29(月) 23:07:16
ポインタのポインタと
配列のポインタを
混同または理解していない香具師が多い
85デフォルトの名無しさん:2007/10/29(月) 23:49:55
ポインタの配列?
86デフォルトの名無しさん:2007/10/29(月) 23:53:24
>>84
おまえのこと?
87デフォルトの名無しさん:2007/10/30(火) 15:14:41
ポインタのそのまたポインタのそのまたポインタ・・・・・訳わかめ
88デフォルトの名無しさん: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
92デフォルトの名無しさん:2007/10/31(水) 09:29:33
・ポインタとは、「メモリ上のアドレスを指し示す」変数である。
・ポインタのみでは実体が無いため、malloc()でそのアドレスを先頭とした実領域を確保する必要がある。

この2点だけ意識してれば十分使えると思うんだけど。何故理解出来ないのかが理解出来ない。
93デフォルトの名無しさん:2007/10/31(水) 10:35:46
データはふわふわと浮かんでるようなイメージでも持ってるのかも
ある「どこかに」はなく、箱の中をただよっているという
94デフォルトの名無しさん:2007/10/31(水) 10:41:44
そういうのを意識してたら
「関数ポインタを引数にとる関数ポインタの多次元配列のポインタ渡し」とかパッと書けるもんなんでしょうか?
だとしたら俺は理解できてないな…
95デフォルトの名無しさん:2007/10/31(水) 11:07:45
四則演算だったら、どれだけ長くなっても難しいとは思わないだろ
1+5-3+2*6+・・・

ポインタだって同じ
96デフォルトの名無しさん: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デフォルトの名無しさん:2007/10/31(水) 11:32:50
>>97
スレチ
99デフォルトの名無しさん:2007/10/31(水) 11:48:16
プログラムが扱えるメモリ空間からスタックと静的領域除いた全てをmallocすればアドレス直指定だけで変数の宣言も定義もいらない幸せプログラミングが
100デフォルトの名無しさん:2007/10/31(水) 11:52:44
そんな風にやるなら、そもそもmalloc必要なくね?
101デフォルトの名無しさん: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デフォルトの名無しさん:2007/10/31(水) 12:09:11
>>99
全てを自分で管理するなら、そもそも高級言語は必要ないんじゃ?
103デフォルトの名無しさん:2007/10/31(水) 12:14:30
int *(*(*ponta[N])(int, int (*)(int)))(int);
やっぱ、ポンタってむずいな、orz
104デフォルトの名無しさん:2007/10/31(水) 12:24:04
ポンタwwww
105デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/10/31(水) 19:31:20
ポンタ微笑ます
108デフォルトの名無しさん:2007/10/31(水) 19:35:39
>>106 103がいいたいのは>>94でしょ
typedef (*pfpf)(int (*)(int));
pfpf pfpfaa_tmp[9][9];
pfpf*** fuck;
fuck = &pfpfaa_tmp;
109デフォルトの名無しさん: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デフォルトの名無しさん:2007/10/31(水) 21:01:22
下手
113デフォルトの名無しさん:2007/10/31(水) 23:02:27
>>1
これから技術者として生きていきたいと、もし君が思っているとしたら。
「〜〜だから、これは学ばなくていい。」という考え方は、
ひとまずやめたほうがいい。

まだ君は、どの情報が必要で、どの情報が必要でないと判断できないわけだから。

まずは、とにかくトコトン悩んでやってみることだよ。
自分の方向性を決めるのは、その後でも十分だと思う。
114デフォルトの名無しさん:2007/11/02(金) 08:35:23
JavaやC#などの次世代の言語にもポインタの概念はしっかり受け継がれてるから知っておいて損はないかと
115デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/02(金) 19:32:37
>>115
ポインタがよくわかりません。教えてください><
118デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/02(金) 19:46:42
>>119
どこが?
void myalloc(char *p1, char *p2)
はchar*の中身を渡しているだけで、
char*自身を渡してないよ。
121デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/02(金) 20:01:56
>0xfefefefeという値とコピーしたローカル変数に過ぎない

0xfefefefeという値「を」コピーしたローカル変数に過ぎない

だった。意味が通じなくなりそうだから念のため修正
123デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/02(金) 20:25:26
こういうところでポインタ宣言と間接参照演算子が同じってのが邪魔してくるんだよな
あと名前の設定をミスってるのが大きい。
char*のやつは文字列型っぽい名前にしなくちゃいけないし、
引数のほうは文字列型のアドレスっぽい名前にしなくちゃ。
132デフォルトの名無しさん:2007/11/02(金) 20:27:50
ってよく見たらmallocおかしいじゃねえかw
133デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/02(金) 20:40:12
>>135
サーセン『pp1は&p1を値に持っている』です。
137デフォルトの名無しさん:2007/11/02(金) 20:40:23
ソースコードでオナニーできて一人前
138デフォルトの名無しさん:2007/11/02(金) 20:40:49
いや、pp1はp1を値に持っているでいいんだ。
139デフォルトの名無しさん:2007/11/02(金) 20:46:44
&&pp1 &pp1 pp1 *pp1 **pp1 ***pp1 処理の度に全部printfで表示させればいいんだよ
140デフォルトの名無しさん:2007/11/02(金) 20:58:48
ベテランの人たちはダブルポインタを扱うとき
いちいち頭で考えて使っているんですか?

それとも体が勝手に動くものなんですか?
141デフォルトの名無しさん:2007/11/02(金) 21:02:40
別にベテランじゃないけど上にあるやつくらいだったら
まともな命名法と*の読み方しだいで何とかなる範囲じゃね?
142デフォルトの名無しさん:2007/11/02(金) 21:06:31
当然頭は使ってるけど何度も使ってれば考える時間は短くて済むようになる
143デフォルトの名無しさん:2007/11/02(金) 21:18:29
C++ならダブルポインタは使わないで済むけどね
144デフォルトの名無しさん:2007/11/02(金) 21:21:23
あれ、>>128で合ってるだろ?と思ったらまちがったって言うのは
>>127がコピペ失敗って意味じゃなくて>>127がバグだったって意味ね
145デフォルトの名無しさん:2007/11/02(金) 22:00:46
freeはいつ呼べばいい?myfree作るべき?
146デフォルトの名無しさん:2007/11/02(金) 22:21:47
宗教論争になりがちだからお好きなように…かなw
147デフォルトの名無しさん:2007/11/02(金) 22:26:52
スマートポインタ使え
148デフォルトの名無しさん:2007/11/02(金) 22:45:47
ポインタって要するに参照渡しのことですよね?
149デフォルトの名無しさん:2007/11/02(金) 22:52:16
参照渡しっていうとなにかとC++の参照が出てくるから困る
150デフォルトの名無しさん:2007/11/02(金) 22:59:47
>>148
参照はダブルポインタ。
151デフォルトの名無しさん:2007/11/03(土) 04:42:12
「ダブルポインタ」っていうのは素人が使う言葉
152デフォルトの名無しさん:2007/11/03(土) 11:51:23
「ダブルポインタ」「ポインタのポインタ」
なんて呼び方はやめて普通に
「ポインタへのポインタ」
って呼べばいい

という主張をどこかで見たな
153デフォルトの名無しさん:2007/11/03(土) 12:36:52
素人は「ダブルポインタ」なんて知らんだろ
154デフォルトの名無しさん:2007/11/03(土) 12:47:29
参照とダブルポインタは違うよね?
155デフォルトの名無しさん:2007/11/03(土) 14:01:21
問題は「ダブルポインタ」と言ってしまうと
「配列へのポインタ」と「ポインタへのポインタ」の
どっちの話をしているのかが決まらないまま話が進むこと

だから素人同士の会話でしか使われない表現ということ
156デフォルトの名無しさん:2007/11/03(土) 14:01:35
ダブルポインタなんて2chでしか貴下ねーな
157デフォルトの名無しさん:2007/11/03(土) 14:03:22
補足

× 問題は「ダブルポインタ」と言ってしまうと

○ 問題は「char **p;」の表記だけを見て「ダブルポインタ」と言ってしまうと

158デフォルトの名無しさん:2007/11/03(土) 14:09:53

ちょっと暇つぶししてみた

ダブルポインタ に一致する日本語のページ 約 3,040 件
ポインタのポインタ に一致する日本語のページ 約 9,800 件
配列のポインタ に一致する日本語のページ 約 672 件
ポインタへのポインタ に一致する日本語のページ 約 616 件
配列へのポインタ に一致する日本語のページ 約 14,800 件

最近はブログのせいでごみばっかり引っかかるようになってしまった
と言っても以前はマニュアルのコピーばっかり引っかかってた訳だが

159デフォルトの名無しさん:2007/11/03(土) 14:13:28
160デフォルトの名無しさん:2007/11/03(土) 14:15:27
(T** a)みたいにするんじゃなくて
(T* *a)にしたら少し理解しやすくなったかもしれないこともなかったような気がした
161デフォルトの名無しさん:2007/11/03(土) 14:19:18
左の * と 右の * はどっちが優先度高いんだっけ?
162デフォルトの名無しさん:2007/11/03(土) 14:20:59
char str[256];
char *p;
p = str;
163デフォルトの名無しさん:2007/11/03(土) 14:21:07
漏れがCやり始めた頃はダブルポインタなんか言ってる香具師は一人もいなかったな
だれが流行らせたんだ?メジャーな入門本に書いてあるのか?
164デフォルトの名無しさん:2007/11/03(土) 14:22:54
>>163

int *p; イントポインタ
double *q; ダブルポインタ

これをだれかが間違って解釈して
馬鹿の間で蔓延したと思われ
165デフォルトの名無しさん:2007/11/03(土) 14:24:54
それは確かにダブルポインタwwwww
166デフォルトの名無しさん:2007/11/03(土) 14:28:21
>>164
それ見てダブルポインタなんてアホな呼び方してるのは
日本人だけだろうと思って調べてみたが
毛唐の間でも普通に使われてるのな
double *p;
int **p;
両方の意味でw

167デフォルトの名無しさん:2007/11/03(土) 14:30:24
>>157
char **p;
と書いて配列へのポインタと解釈することなんてありえるか?
配列へのポインタといったら
char (*p)[N];
じゃないのか?
168デフォルトの名無しさん:2007/11/03(土) 14:31:55
>>167

int main(int argc, char **argv)
169デフォルトの名無しさん:2007/11/03(土) 14:32:28
ちなみにmeta-pointerって呼び始めたのは俺。
MITで今じゃ完全に定着しているって後輩が言ってた。
170デフォルトの名無しさん:2007/11/03(土) 14:32:48
>>168
それはポインタの配列
171デフォルトの名無しさん:2007/11/03(土) 14:37:23
配列のポインタとポインタの配列は区別しようぜ
172デフォルトの名無しさん:2007/11/03(土) 14:45:37
馬鹿が馬鹿に説教するスレはここですか?
173デフォルトの名無しさん:2007/11/03(土) 14:48:52
>>171
ポインタの配列とダブルポインタの区別はしなくても平気ですか?
174デフォルトの名無しさん:2007/11/03(土) 14:48:53
馬鹿じゃないよ
C言語は得意だけど日本語が苦手なだけだよ
175デフォルトの名無しさん:2007/11/03(土) 15:16:47
double *pは「double型へのポインタ」だろ。そうとしか読めない。
176デフォルトの名無しさん:2007/11/03(土) 15:18:28
ダブルポインタって言葉をほとんど聞いたことが無い
177デフォルトの名無しさん:2007/11/03(土) 15:27:47
俺はある
178デフォルトの名無しさん:2007/11/03(土) 16:10:38
二重ポインタならよく聞くけど、ダブルポインタは滅多に聞かないな。
179デフォルトの名無しさん:2007/11/03(土) 16:23:17
二重ポインタは初耳
ポインタへのポインタばっかり
180デフォルトの名無しさん:2007/11/03(土) 16:40:33
今の今までインディレクトポインタと呼んでいたぞ。
181デフォルトの名無しさん:2007/11/03(土) 16:48:30
昔、面接で「ダブルポインタはOKですが、トリプルポインタは自信がありません」と言った香具師がいた。
案の定、ポインタを理解していなかった。
182デフォルトの名無しさん:2007/11/03(土) 17:52:53
183デフォルトの名無しさん:2007/11/03(土) 17:53:31
184デフォルトの名無しさん:2007/11/03(土) 23:55:27
そうだ。ダブルポインタとはdouble*のことに違いない。
185デフォルトの名無しさん:2007/11/04(日) 00:00:19
ポインタへのポインタへのポインタは使ったことがない気がする
186デフォルトの名無しさん:2007/11/04(日) 01:59:00
*** は滅多に使わないけど全く使わないということはない
ただそういうときには typedef するか struct になってることの方が多い
187デフォルトの名無しさん:2007/11/04(日) 06:03:01
>>186
使い道が想像できん。
188デフォルトの名無しさん:2007/11/04(日) 10:44:18
>>187
行列の配列とか?
189デフォルトの名無しさん:2007/11/04(日) 12:25:14
3次元の配列の動的確保
190デフォルトの名無しさん:2007/11/04(日) 13:17:16
文字列の二次元配列を使おうとしたときに
どうすればいいか分からなかった漏れが来ましたよ
191デフォルトの名無しさん:2007/11/04(日) 13:32:29
char Array[32][16];
192デフォルトの名無しさん:2007/11/04(日) 13:34:02
>>191
いやそれ文字列になってないw
193デフォルトの名無しさん:2007/11/04(日) 13:35:08
文字の二次元配列だな
194デフォルトの名無しさん:2007/11/04(日) 13:50:07
std::vector<std::vector<std::string> > Array;
195デフォルトの名無しさん:2007/11/04(日) 13:51:26
>>192-193
/(^o^)\
196デフォルトの名無しさん:2007/11/04(日) 16:13:34
std::vector<std::vector<std::string *> *> *Array;
197デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/04(日) 20:32:50
ベクトル
200デフォルトの名無しさん:2007/11/04(日) 20:34:06
う゛ぇくとぉ
201デフォルトの名無しさん:2007/11/04(日) 20:40:22
typedef char *string;
string Array[32][16];
/* 200 get */
202デフォルトの名無しさん:2007/11/04(日) 23:16:19
え?
203デフォルトの名無しさん:2007/11/05(月) 00:40:49
ウルトラ警備隊に聞いてみろ
204デフォルトの名無しさん:2007/11/05(月) 01:07:41
ポインタを理解できない人は、C言語 ポインタ完全制覇を読みなさい。
それでも、わからなければ・・・・
私は知らん。
205デフォルトの名無しさん:2007/11/05(月) 01:29:37
>>204
あれはいいものだ・・・
206デフォルトの名無しさん:2007/11/05(月) 07:48:59
考え方や概念よりも、文法がややこしいんだと思うよ。
変数に成り代われるのは演算子のおかげであって、ポインタ自体はアドレスを指すことしか出来ないんだから。
207デフォルトの名無しさん:2007/11/05(月) 12:15:17
ああ、ポインタの概念自体をさっぱり理解できない人はまずいない。
演算子の扱いとか、関数の引数や戻り値としての扱いとか、直観に反する振る舞いをするのでつまづく。
208デフォルトの名無しさん:2007/11/05(月) 14:27:35
滅茶苦茶直観的だけど
209デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/05(月) 19:33:55
処理系依存なことを言語仕様に定められてるかのように書くなよ・・・
212デフォルトの名無しさん:2007/11/05(月) 19:43:46
>>210
そもそも正数っていうのは0より大きい実数のことであって、
unsigned intっていうのは0以上の整数のことであるわけだが。
213デフォルトの名無しさん:2007/11/05(月) 19:48:18
>>212
それ自然数
214デフォルトの名無しさん:2007/11/05(月) 19:49:06
じゃなくてあってんのか。
まあいいや。
215デフォルトの名無しさん:2007/11/05(月) 20:07:26
というかこんなことが出来たとして何の役に立つの?
216デフォルトの名無しさん:2007/11/05(月) 20:56:27
出来ない奴が役に立たない
217デフォルトの名無しさん:2007/11/05(月) 21:15:37
ポインタをintにキャストする人は役に立つんだね
知らなかったよ
218デフォルトの名無しさん:2007/11/05(月) 21:24:33
俺は知ってた
219デフォルトの名無しさん:2007/11/05(月) 21:55:12
過去に一回だけそんな使い方をしたことあるな・・・
なんでそれをやったかは忘れた
220デフォルトの名無しさん:2007/11/05(月) 22:11:37
ポインタ値の配列の宣言がわからなくてintの配列で代用した

こんなあたりだろ


221デフォルトの名無しさん:2007/11/06(火) 00:14:25
ポインタの配列ってこうでいいんじゃないんですか?
int* pointa[10];
222デフォルトの名無しさん:2007/11/06(火) 00:16:26
確かにそうだが変数名が気に入らないw
223デフォルトの名無しさん:2007/11/06(火) 00:39:02
>>222

気にしては駄目だw
224デフォルトの名無しさん:2007/11/06(火) 00:52:22
ポインタの配列
int* ponta[10];

int配列へのポインタ
int(* ponta)[10];

でいいんですよね?
225デフォルトの名無しさん:2007/11/06(火) 00:55:41
int[]型みたいなのが無いから書き方がカオスだな
226デフォルトの名無しさん:2007/11/06(火) 00:58:13
ポインタの文法を学ぶ前になんでポンタが必要かを理解させないから苦労して学ぶ気になれないのでは
なんで?最近の言語はコンパイル時に勝手に最適化してくれるんじゃないの?

WEB系ではいらない?
汎用系では?
制御・ファーム・ハード系では?
ソフト系では?
227デフォルトの名無しさん:2007/11/06(火) 00:59:50
『昔のPC・OSではな〜メモリが64KBしかなくてな〜』とか言う懐古厨はお断り
228デフォルトの名無しさん:2007/11/06(火) 01:06:17
最近の若い子はなんでも参照で済ますから・・・
229デフォルトの名無しさん:2007/11/06(火) 01:08:29
>>224
たしか、それでおkなはず
230デフォルトの名無しさん:2007/11/06(火) 02:56:11
int a;
double *p;
p = (double *)&a;
*(int*)p = 10;
printf("%d",a);

結果:
10
231デフォルトの名無しさん:2007/11/06(火) 03:39:01
当たり前って言えば当たり前
232デフォルトの名無しさん:2007/11/06(火) 08:32:43
>>230
それは流石に駄目だろう
多分、出来なくはないだろうけど浮動小数点数の演算が適応されないポインタに対してこれはナンセンス過ぎないか?
233デフォルトの名無しさん:2007/11/06(火) 11:10:25
int a;
double p;
p = (double)&a;
*(int*)p = 10;
printf("%d",a);

結果:

>>232
これと勘違いしてない?
234デフォルトの名無しさん:2007/11/06(火) 11:42:39
>>230
色々怖いな。
235>>232:2007/11/06(火) 13:52:26
>>233
見間違えサーセンw
236デフォルトの名無しさん:2007/11/06(火) 14:59:59
sizeof(int*) <= sizeof(double*)な処理系じゃないとダメじゃね?
まあこれを満たさない処理系なんてあるのか知らないけど
237デフォルトの名無しさん:2007/11/06(火) 15:17:15
>>236
いろいろわかってなさ杉
238デフォルトの名無しさん:2007/11/06(火) 15:29:44
初心者だけど

>>233
のコードが実行できると
どっかのメモリに10が代入されるってことなのか?
239236:2007/11/06(火) 15:34:16
>>237
ポインタのサイズは指している型に関わらず同じ、なんてことは無かったような気がするんだけど
間違ってる?
240デフォルトの名無しさん:2007/11/06(火) 15:34:21
aに10が入る
241デフォルトの名無しさん:2007/11/06(火) 15:37:47
>>239
ポインタはint型のサイズと同じって記憶があるけど。
242デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/06(火) 15:55:40
>>243
なるほどね、読み返して見たら納得できた。
246236:2007/11/06(火) 16:24:31
どっかで見た気がしたんだが記憶違いだったか
しかし、void*とかmallocとか考えるとありえないなorz
スレ汚しすまんかった
247デフォルトの名無しさん:2007/11/06(火) 16:48:26
>>241
それはない
248デフォルトの名無しさん:2007/11/06(火) 16:59:09
>>241
そういう場合もある
249デフォルトの名無しさん:2007/11/06(火) 18:25:36
現状そういう処理系が実在しないにしても
規格上はint *とdouble *が安全に変換できるとは限らない
void *を介しても同じ事
250デフォルトの名無しさん:2007/11/06(火) 18:37:14
昔々、ポインタにはfarとnearがあっての…
251デフォルトの名無しさん:2007/11/06(火) 19:33:07
ポインタなんて今時覚える必要ないと思う。
C#とかポインタを気にせずプログラミングできる言語が主流になりゃいい。
今後PCはどんどん高性能化していって統合環境が整うんだからポインタみたいな
危険な構造、なくしてけばいいよ。
そういうのはコンパイラに任せとけ。
252デフォルトの名無しさん:2007/11/06(火) 21:20:12
例えば貴方の身の回りの家電や車の制御プログラムにC#を入れるとな?
こういうマイコンは限られたメモリをいかに容量的に効率的に高速に使うかが大事
253デフォルトの名無しさん:2007/11/06(火) 21:24:25
>>252
ただ現実にはそういう方向かもね。携帯とか Java 走ってる。

あと、C 使いこなすにはポインタ理解する必要はあるけど、
必要以上にポインタを使い回す事はない。パフォーマンスが
心配なら実際 profiling してから直すべき。

ついでに、あまり複雑なことをしなけりゃポインタも簡単。
254デフォルトの名無しさん:2007/11/06(火) 22:10:34
Javaとかにも、配列の途中からを指す方法があればなあ
配列そのものと、何番目かをあらわすIndexと。二つ渡すのが非常にかっこわるい
255デフォルトの名無しさん:2007/11/06(火) 22:13:04
SubList使えよ
256デフォルトの名無しさん:2007/11/06(火) 22:36:26
携帯Javaにはそんな便利なもんねえ
257デフォルトの名無しさん:2007/11/07(水) 06:26:59
>>251
C#、Javaはむしろポインタだらけじゃないか?
258デフォルトの名無しさん:2007/11/07(水) 06:56:56
>>243
>doubleにintポインタのアドレスを入れるけど、
>doubleの値をintポインタにキャストしてるから、
>結局int aに値を入れてるのと同じ。

double*に入れるときは問題ないけど
doubleに入れるときはアドレス値がdouble値としてふさわしくないときに
正規化されて他の正しい浮動小数点数に変換されるだろうから
int*にキャストしたときには別の場所を指してる可能性があるね
259デフォルトの名無しさん:2007/11/07(水) 07:39:19
そんな環境実際にあんの?
260デフォルトの名無しさん:2007/11/07(水) 08:32:42
>>259
確かにその通り。正規化云々以前にポインタ値をdouble変数に入れられない。
261デフォルトの名無しさん:2007/11/07(水) 08:39:01
どうせ二進表現の数なんだから、ビット幅さえ合えば入れられるんじゃないの?
数値としては別な物になるだろうけど。
262デフォルトの名無しさん:2007/11/07(水) 10:38:38
>>261
つ[規格]
263デフォルトの名無しさん:2007/11/07(水) 11:06:58
アセンブラをやれ でFA?
264デフォルトの名無しさん:2007/11/07(水) 14:24:27
>>261
longに入れたりintに入れたりは幅だけ合ってれば出来るけど
doubleの場合は規格化された値しか入れられないよ
265デフォルトの名無しさん:2007/11/07(水) 14:27:32
>>261
union {
double d;
int *p;
} hoge;

hoge.p = (int *)-1;
printf("%f", hoge.d);

これやってみ
266デフォルトの名無しさん:2007/11/07(水) 19:32:13
なんていうか
無理に1000いくまで議論しなくてもいいと思うんだ・・・
267デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/07(水) 21:25:14
関数へのポインタだろ
269デフォルトの名無しさん:2007/11/07(水) 21:25:29
関数へのポインタへのダボーポインタだろ
270デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/07(水) 23:55:36
なんか変なレスが混ざってるんだが、わざとやってるのか?
277デフォルトの名無しさん:2007/11/08(木) 00:00:13
なんか間違ってね?
278デフォルトの名無しさん:2007/11/08(木) 00:05:54
>>270の答えは何ポンタ?
279デフォルトの名無しさん:2007/11/08(木) 00:06:44
関数配列ってなに
280デフォルトの名無しさん:2007/11/08(木) 00:14:16
>>279
つ kannsuuhairetsu[] = {kannsuu0, kannsuu1, kannsuu2,......};
281デフォルトの名無しさん:2007/11/08(木) 00:27:05
関数ポインタって代入時の&と実行時の*ってなくても動作変わらないよね?
もともとはどっちが正しいの?
282デフォルトの名無しさん:2007/11/08(木) 01:06:42
元々必要だったらしいが、gccがなんか理論武装して独自拡張として省略しても良くしたら、
世間に受け入れられたなんて話を聞いたことがある。
283デフォルトの名無しさん:2007/11/08(木) 01:17:09
余計ややこしくなった気もしますね
284デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/08(木) 17:41:18
変数に入ってる具体的な数字をprintしてみればすぐわかる
294デフォルトの名無しさん:2007/11/08(木) 17:42:52
更に、>290のように&演算子を使った値は右辺値なので代入ができない。
295デフォルトの名無しさん:2007/11/08(木) 17:54:38
printしたらAが出ました。
printf("%c\n",**a);
296デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/08(木) 18:13:38
&a: 文字列のアドレスのアドレス
a: 文字列のアドレス
*a: 文字列(文字配列へのポインタ)
**a: 先頭文字
299デフォルトの名無しさん:2007/11/08(木) 18:14:52
>>292
その通りにやってもエラで落ちます・・
300デフォルトの名無しさん:2007/11/08(木) 18:16:03
違った、
*a: 文字列(文字へのポインタ)
301デフォルトの名無しさん:2007/11/08(木) 18:19:16
&a: ローカル変数a自身のアドレス
a: aの指すアドレス
*a: aの指すアドレスの中身(文字配列全体)を指すアドレス?
**a: aの指すアドレスの・・・?
302デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/08(木) 18:51:37
>>303
 char str_a[] = "ABC"; (引数&str_a)もしくは
 char **str_a = "ABC";(引数str_a)で宣言すると
無事に"文字列"全体が交換されたんですけど、先頭文字だけでは無いんですね。何故か
306デフォルトの名無しさん:2007/11/08(木) 18:53:48
いや、なんでもないです。>>305は無視してください
307デフォルトの名無しさん:2007/11/08(木) 19:56:18
ポインタのポインタのポインタのポインタとか
ヘンタイじみたモノは使うのを辞めましょう
308デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/09(金) 00:31:10
寝なくていいよ
312デフォルトの名無しさん:2007/11/09(金) 03:30:41
313デフォルトの名無しさん:2007/11/09(金) 22:13:25
void main()
{
  (*************************************************************************************************************************************************************************printf)("hello\n");
}

これも出来たから大丈夫
314デフォルトの名無しさん:2007/11/09(金) 22:16:57

http://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デフォルトの名無しさん:2007/11/09(金) 23:25:03
つーかこれ通るんだから。
int main(void) {
1;
return 0;
}
316デフォルトの名無しさん:2007/11/10(土) 00:39:09
main(){
('A')
}
317デフォルトの名無しさん:2007/11/10(土) 01:41:07
懐かしい!!ポインタは面白いね

char *s1, *s2;
while (*(unsigned long long *)s2 = *(unsigned long long *)s1);

この超ドSなコピーとかやってみ?ほんとハラハラさせてくれるよね
318デフォルトの名無しさん:2007/11/10(土) 01:45:28
s2++,s1++するの忘れた
ついポインタに目がいってしまいました
319デフォルトの名無しさん:2007/11/10(土) 01:52:25
main(){
('A')マンドクセ
}
320デフォルトの名無しさん:2007/11/10(土) 02:02:52
ボインたん (;´Д`)ハァハァ
321デフォルトの名無しさん:2007/11/10(土) 02:21:33
(ポインタをメンバに持つ構造体)をメンバに持つ構造体へのポインタ

あたりの自己参照構造体が難しいのですが・・・どうすりゃいいんだ〜〜〜〜
322デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/10(土) 02:48:13
>>325
だめ
そいつはC++でしかできない
327デフォルトの名無しさん:2007/11/10(土) 02:57:55
>>326
そうなんかd
最近「C言語で開発」とか言われても、開発環境がC++だから
どこまでがCの仕様なのかわからなくなることがある
328デフォルトの名無しさん:2007/11/10(土) 02:59:49
C++コンパイラ使ってベターCな開発するのはいいが、
その機能がCのものなのかC++のものなのかも理解して
いないような香具師らもウジャウジャいるから気をつけろ。
329デフォルトの名無しさん:2007/11/10(土) 03:18:38
>>326
え??いいんじゃないの?
330デフォルトの名無しさん:2007/11/10(土) 03:20:31
>>328
俺の事だ/(^o^)\
331デフォルトの名無しさん:2007/11/10(土) 03:20:49
>>326

あ、今試したらだめだった
なんでダメなんだっけ?
332デフォルトの名無しさん: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言語でプログラムされてるの?
http://pc11.2ch.net/test/read.cgi/tech/1183559070/
339デフォルトの名無しさん:2007/11/10(土) 04:19:02
340デフォルトの名無しさん: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 とか(平気で書ける神経が)理解できねえ(笑)
http://www.kt.rim.or.jp/~kbk/zakkicho/07/zakkicho0708b.html
■ げねれーた
342デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/10(土) 10:29:36
>>336
char配列の初期化には、例外的に文字列リテラルが使えるという決まりがあるから。
347デフォルトの名無しさん:2007/11/10(土) 10:36:20
>>345
普通に実行できた

$ ./a
p = ADCD
q = ADCD
348デフォルトの名無しさん:2007/11/10(土) 10:57:43
char *p = "ABCD";
は静的なところにある"ABCD"のアドレスをpに入れてるだけ
って認識であってるよね?
349デフォルトの名無しさん:2007/11/10(土) 11:17:54
cc -S a.c して a.s 読めば一目瞭然。

350デフォルトの名無しさん:2007/11/10(土) 11:28:17
>>349
流石に20代だから
流石にアセンブラなんて知りませんよ。流石に
351デフォルトの名無しさん:2007/11/10(土) 12:50:43
>>350
いや。読むだけならアセンブラは簡単。

ポインタの理解にはアセンブラが、
オイラの持論だ。
352デフォルトの名無しさん:2007/11/10(土) 17:36:57
アセンブラを理解するのには、ものすごく基本的な
メモリとアドレスの事知る必要がある。
それがポインタを理解する上でも必要ってだけのことだ。

運転覚えるのにエンジン分解したいひとは、アセンブラからどうぞ。
353デフォルトの名無しさん:2007/11/10(土) 17:44:32
分解したくはないけれど、どんな気筒が幾つ、どんな風に配列されているかは知りたいぞ。
354デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/10(土) 20:30:30
そのとおりだな。

アセンブラを知らないプログラマーは
自動車運転できるのにボンネットを一度も
開けたことの無い人に相当する。
356デフォルトの名無しさん:2007/11/10(土) 20:38:34
俺アセンブラ知らないけどあんまりポインタで困った覚えがない

ボンネットはウォッシャー液が切れたら空ける
357デフォルトの名無しさん:2007/11/10(土) 20:45:42
学習のとっかかりとしてはいいけど、基本的に
アドレスとポインタとは切り分けて考えた方がいいよ
358デフォルトの名無しさん:2007/11/10(土) 20:47:07
ΩΩ Ω<ナ、ナンダッテー

アドレスとポインタって違いを3行で
359デフォルトの名無しさん:2007/11/10(土) 20:52:18
ポインタには(対象の型)という情報が含まれている。
アドレスと言う概念にはそんなものは全くない。
強いて言うなら、void * のようなもの。
360デフォルトの名無しさん:2007/11/10(土) 20:54:12
ほんとに3行だw
ありがとう
361デフォルトの名無しさん:2007/11/10(土) 21:00:13
そもそも規格には、ポインタの値はアドレスであるなんて一言も書いてない。

ってほんと?
362デフォルトの名無しさん:2007/11/10(土) 21:01:59
普通に考えればそうだろ
変数を間接的に指し示してくれさえすれば用は足りるわけだし
363デフォルトの名無しさん:2007/11/10(土) 21:13:08
>>354
うそだろ?
364デフォルトの名無しさん:2007/11/10(土) 21:19:22
ポインタはアドレスを入れるための変数。
お茶碗とごはんの関係。
365デフォルトの名無しさん:2007/11/10(土) 22:14:51
ポインタはただの変数だ〜
366デフォルトの名無しさん:2007/11/10(土) 22:21:37
>>355
そのたとえで行くならば、IC やトランジスタ弄ったこと
ない人も同じだな。
367デフォルトの名無しさん:2007/11/10(土) 23:35:12
物理化学やら量子力学を勉強してない人も(ry
368デフォルトの名無しさん:2007/11/10(土) 23:39:11
一人の人間の一生程度じゃどうしようもない範囲ですな
369デフォルトの名無しさん:2007/11/11(日) 01:31:28
俺は頭がいいからなんとかなるけど
低収入のオマエラじゃ無理だな
370デフォルトの名無しさん:2007/11/11(日) 01:40:23
>>369
はいはい、掲示板では何とでもいえるさw
371デフォルトの名無しさん:2007/11/11(日) 03:08:02
>>341
実際こう書くこと多いけど何か問題でもあんの?
372デフォルトの名無しさん:2007/11/11(日) 03:10:51
読みにくいってだけじゃないの?
373デフォルトの名無しさん:2007/11/11(日) 03:15:32
>>371,372

まぁ論外だ。論外だということを理解できない君が、プログラマでない
ことを願う。
374デフォルトの名無しさん:2007/11/11(日) 03:31:38
残念
375デフォルトの名無しさん:2007/11/11(日) 05:10:31
>>371-372
おいおい・・・
376デフォルトの名無しさん:2007/11/11(日) 08:08:22
で実際なにがいけないの?
377デフォルトの名無しさん:2007/11/11(日) 09:51:13
何故にポインタが存在するのか。これがわかれば楽勝
378デフォルトの名無しさん:2007/11/11(日) 11:17:01
俺は第一印象で、途中にNULLがあったらどうするんだ?って思ったが。
379デフォルトの名無しさん:2007/11/11(日) 12:34:15
コーディングは暗号解読じゃねえんだ
380デフォルトの名無しさん:2007/11/11(日) 12:51:28
いやぁ、コメントと改行とインデントがちゃんとしてれば
結構普通に読めると思うけど


でもこれはポインタの話とは違くねぇ?
381デフォルトの名無しさん:2007/11/11(日) 12:54:51
>>380
ポインタは普通の構造体に比べてコピーのコストかからないんだから
逐一名前を付け替えたほうが可読性あがるしそっちのほうが良かろう
382デフォルトの名無しさん:2007/11/11(日) 13:10:43
可読性はポインタには限らないじゃないってことを言いたかった
383デフォルトの名無しさん:2007/11/11(日) 13:57:36
英検準2級に落ちたああア
384デフォルトの名無しさん:2007/11/11(日) 14:46:49
>>383
ポインタの問題でつまづいたか?
385デフォルトの名無しさん:2007/11/11(日) 15:48:43
中間ポインタを置いたほうが
読みやすいってことなの?
386デフォルトの名無しさん:2007/11/11(日) 17:00:16
まず中間ポインタって何よ
387デフォルトの名無しさん:2007/11/11(日) 17:59:52
まぁ、C言語だと、短縮した記述とか、複雑なポインタの連鎖をつかって、
「俺、おまえらと違って頭いいんだよ」
と分り難いコードを得意げに自慢げに晒すヤツが
けっこう居る
388デフォルトの名無しさん:2007/11/11(日) 18:00:33
うん
389デフォルトの名無しさん:2007/11/11(日) 18:07:30
頭が良いことは良いことだ
390デフォルトの名無しさん:2007/11/11(日) 19:10:38
>>388,389

ソースコードの読み手が、「このコード大丈夫か?」とか
心配させるようなコード書くようなヤツは頭がいいとは言わない。

ソースコードの読み手が、立ち止まることなく「このコードは
大丈夫」だと確信しながら、スラスラ読めるコードを書くヤツは
頭がいい。

結論としては>>341のようなコードを書くヤツは頭が悪い。
391デフォルトの名無しさん:2007/11/11(日) 19:12:10
たいていの商品は分かりやすさこそ売り物の価値なんだよ。
高齢化社会を迎える日本だと特にそうだ。

戦後の日本文学が、難解であれば崇高だと勘違いして衰退してしまった反省を
ソースコードにおいても生かしてほしいもんだ。
392デフォルトの名無しさん:2007/11/11(日) 19:33:55
同意ではあるんですが
読む人のレベルにもよりませんか?
393デフォルトの名無しさん:2007/11/11(日) 19:37:09
>>390
うん
394デフォルトの名無しさん:2007/11/11(日) 19:52:45
>>392
もちろんプログラマとしての常識は、身につけている
という前提は必要。

常識というのは、言語に関する知識、アルゴリズムに
関する知識、慣用句に関する知識くらいかな。パッと
思いつく限り。

あとは、プログラムが対象としている分野ごとの
知識は前提とするけど。例えば、デコーダのプログラム
のソースコードならば、読み手がそのデコードの
アルゴリズムを知っているという前提をした上で、
プログラムを書くことになる。
395デフォルトの名無しさん:2007/11/11(日) 20:01:26
でも.Net Framework、SQL、XML、WebServices、などなど…。
色々ありすぎて、「言語に関する知識」「アルゴリズムに関する知識」という定義が
やっぱり人それぞれになってしまうと思う。
396デフォルトの名無しさん:2007/11/11(日) 21:04:45
>>395
それはどれも応用プログラミングの専門知識であって常識ではないんじゃないか。
現場の常識という事はあるかもしれないが、それでは一般論とはいえない。

ある範囲で分野を定義した時にその中の最低限の知識というのがあるわけで、
それ以上のテクニックだかノウハウだかを理由も無く濫用するのが良い習慣でないのは
間違いないだろう。
397デフォルトの名無しさん:2007/11/11(日) 21:07:57
つうかそんな基本的なところで俺SUGEEやってないで仕事に集中しろよと
398デフォルトの名無しさん:2007/11/11(日) 23:01:25
べた集中するための遊びだろ。
だいたい1:9ぐらいかな。
399デフォルトの名無しさん:2007/11/12(月) 16:34:54
オ…オ…オレSugeeeee!
…って思うもんさ、プログラマなら…
400デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/13(火) 18:16:53
宣言に問題あるよな、
最初からそういうもんだと思ってたからあまり考えなかったけど。
int *p, *q;
じゃなくて
*int p, q;
にすりゃいいんだ。
404デフォルトの名無しさん:2007/11/13(火) 18:18:20
pointer<int> p;
こうだろ
405デフォルトの名無しさん:2007/11/13(火) 18:48:11
>>403
その記法で関数ポインタとポインタを返す関数をどうやって区別する?
406デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/14(水) 09:13:50
>>410

あ、何となくわかってきた。

   タイプ

ド データ



アドレス*タイプでデータを指し示すから、*pで、データをアドレス&タイプに変換するから、
&aなんだな。
414デフォルトの名無しさん:2007/11/14(水) 09:17:24
413が何を言ってるのかわからんのだが
415デフォルトの名無しさん:2007/11/14(水) 09:21:59
>>414

「*」や「&」という変な文字を使う理由について推測しただけ。
416デフォルトの名無しさん:2007/11/14(水) 09:45:47
&は変数のアドレスを得る演算子
*はポインタの先にある実体を得る演算子

p = &a;

は変数aのアドレスをポインタpに代入。

*p = 5;

はpに入っているアドレスの先を書き換える処理

というのは理解してるのかな?
417デフォルトの名無しさん:2007/11/14(水) 13:08:50
ポインタ変数を使うからよく分からなくなるのではないか?

longかなんかの変数にポインタを代入して、いろいろやってたら何となく分かって来るよ。きっと。



環境依存だけど。
418デフォルトの名無しさん:2007/11/14(水) 13:47:37
なぜわざわざ・・・
419デフォルトの名無しさん:2007/11/14(水) 17:34:00
それやるくらいだったら、
アセンブリ言語使ってみろというほうがずっと有意義。
420デフォルトの名無しさん:2007/11/14(水) 17:39:28
よくアセンブリ言語薦めるやついるけど、
JavaとかC#とかの高級言語触らせたほうが、どうしてポインタが欲しくなるのかを理解するのにはいいんじゃないか?
421デフォルトの名無しさん:2007/11/14(水) 18:00:35
>>420
JavaとかC#だって、ポインタはあるのだから、欲しくなんてならない。
422デフォルトの名無しさん:2007/11/14(水) 18:01:06
アセンブラなんてしなくてもC++とXbyakで遊べばいいんだよ
423デフォルトの名無しさん:2007/11/14(水) 18:02:49
ポインタや再帰を駆使したアルゴリズムの本ない?
424デフォルトの名無しさん:2007/11/14(水) 18:03:53
Javaにもポインタってあるんですか?
425デフォルトの名無しさん:2007/11/14(水) 18:06:45
>>421
ちげーよ、安全に使えるようになってるから理解しやすいかと思ったんだよ。
426デフォルトの名無しさん:2007/11/14(水) 18:06:59
ポインタと再帰はあんまり関係なくね?
427デフォルトの名無しさん:2007/11/14(水) 18:07:34
>>424
ヒント:ぬるぽ
428デフォルトの名無しさん:2007/11/14(水) 18:08:29
>>424
ポインタは無いよ
429デフォルトの名無しさん:2007/11/14(水) 18:11:19
>>420
アセンブラは良く知らんが同意

>>421
趣味でちょっとしたTCP/IPプロトコルを実装しているんだが
ポインタがないと俺には無理ってぐらいだ
こんなものをC#とかJavaとか他の言語でどうやって書けと(ry
ポインタとmemcpyを使ってソース書くときれいになって読みやすくなってるぞ
430デフォルトの名無しさん:2007/11/14(水) 18:13:31
C#にポインタはあるよ
431デフォルトの名無しさん:2007/11/14(水) 18:15:32
C脳から抜け出せてないのやら他言語に疎いのやら
432429:2007/11/14(水) 18:15:35
>>430
あれは紛い物
433デフォルトの名無しさん:2007/11/14(水) 18:22:26
どういう点が?
434デフォルトの名無しさん:2007/11/14(水) 18:23:12
ポインタだけに点
435デフォルトの名無しさん:2007/11/14(水) 18:29:18
これはいい脱力感
436デフォルトの名無しさん:2007/11/14(水) 18:37:23
わふ?
437デフォルトの名無しさん:2007/11/14(水) 23:10:45
>>432
結局根拠無し?
438 :2007/11/16(金) 00:10:00
アセンブラ役にたたんかもしれんが
理解を深めるには結局は近道だと思われ
439デフォルトの名無しさん:2007/11/16(金) 07:30:47
ポインタの理解には、メモリとアドレスについて知れば十分。
インストラクションコードの知識が必要になるのは、もっとずっと後。
440デフォルトの名無しさん:2007/11/16(金) 08:37:13
絶対アドレッシングと相対アドレッシングまで押さえれば完璧
441デフォルトの名無しさん:2007/11/16(金) 09:11:57
//
442デフォルトの名無しさん:2007/11/16(金) 21:44:40
い・・・いんす・・・とらく・・・?
443デフォルトの名無しさん:2007/11/17(土) 02:40:14
たー・・・のお・・・ね・・・えちゃん・・・?
444デフォルトの名無しさん:2007/11/17(土) 06:48:29
ハンドアセンブルで COM ファイルを書いてみる。
445デフォルトの名無しさん:2007/11/17(土) 07:24:47
ORG 100
446デフォルトの名無しさん:2007/11/17(土) 07:32:12
ハンドアセンブルが許されるのはZ80までだよねー(AA略
447デフォルトの名無しさん:2007/11/18(日) 10:52:54
全てのものはメモリ上においてあって、位置はアドレスで示せて、ポインタはアドレスを入れる変数、
でいいんじゃね?
448デフォルトの名無しさん:2007/11/18(日) 12:01:50
ポインタの「型」を忘れるなと何度言ったr
449デフォルトの名無しさん:2007/11/18(日) 12:56:38
450デフォルトの名無しさん:2007/11/18(日) 14:15:25
エスパーのおれが解説を試みてみる

char *cp;
int *ip;
/* いろいろやる */
cp++;
ip++;

の最後の2行の挙動が>>447には含まれてないってことじゃね?
451デフォルトの名無しさん:2007/11/18(日) 14:37:46
なるほど。ご指摘&解析ありがとう。
では447の補足。
ポインタには加算減算が定義されている。加算結果のアドレスがいくつ増えるかはポインタの型に依存する。
intが4バイトの処理系でintのポインタに+1するとアドレスは4バイト移動する。
これはメモリ上の連続領域にかかれたintデータにアクセスする際に便利。

ぜんぜんわかりやすくないな。サーセン。
452デフォルトの名無しさん:2007/11/18(日) 14:39:50
なるほど。ご指摘&解析ありがとう。
では447の補足。
ポインタには加算減算が定義されている。加算結果のアドレスがいくつ増えるかはポインタの型に依存する。
intが4バイトの処理系でintのポインタに+1するとアドレスは4バイト移動する。
これはメモリ上の連続領域にかかれたintデータにアクセスする際に便利。

ぜんぜんわかりやすくないな。サーセン。
453デフォルトの名無しさん:2007/11/18(日) 14:40:05
加算減算に触れるのには相対アドレス絶対アドレスみたいなのも理解が必要だと思うけど
こういう仕様が表に出ている事のメリットがいまひとつわからない
454デフォルトの名無しさん:2007/11/18(日) 15:10:32
>>447
厳密に言うとメモリ上にない変数もあるのだ、ふっふっふ。
455デフォルトの名無しさん:2007/11/18(日) 15:25:00
レジスタ上ってこと? 確かに忘れてた。ご指摘感謝。
まぁポインタの話をするときはメモリ上って事でいいのでは?
456デフォルトの名無しさん:2007/11/18(日) 15:26:36
いまレジスタってあるの?
457デフォルトの名無しさん:2007/11/18(日) 16:12:24
あるよ、何言ってるんだ?
458デフォルトの名無しさん:2007/11/18(日) 16:28:51
全然意識したことないや
459デフォルトの名無しさん:2007/11/18(日) 16:34:56
じゃあ
register int i;
&i;
ってやってみるといいよ。コンパイラに怒られるから。
460デフォルトの名無しさん:2007/11/18(日) 16:50:18
C言語に register はあるけど、どう扱うかはコンパイラ任せ
じゃない?実際任せるしか無いと思うけど。多少配慮は
してくれるはずだが、下手するとかえって遅くなる場合もある。

CPU 上の話はまたそれはそれで違うよね。
461デフォルトの名無しさん:2007/11/18(日) 17:48:35
レジスタ増えすぎだし人間が管理するより任せた方がいいわな
高級言語でわざわざ意識する機会なんてまず無いわ
462デフォルトの名無しさん:2007/11/18(日) 17:50:14
registerなんてもう10年位使ってない
463デフォルトの名無しさん:2007/11/18(日) 18:26:58
ま、今時register修飾なんか無視するコンパイラがほとんどだよね。
ただしアドレスだけは取れないようになっている。
464デフォルトの名無しさん:2007/11/18(日) 21:02:19
そういえば俺も 10 年以上前にどの変数を register 宣言すると速くなるか、
とか一所懸命自分のコードで調べてた覚えがあるな。けどもうずっと使って
なくてコンパイラ任せ。
465デフォルトの名無しさん:2007/11/20(火) 16:08:13
registerを使わなきゃならんような場面、今後はもうないだろうね。
少ない資源で必死に高速化してた頃が懐かしす。
466デフォルトの名無しさん:2007/11/20(火) 17:48:31
組み込み系ではまだ、たまに使う場面あるけどね。
467デフォルトの名無しさん:2007/11/21(水) 15:31:11
regster使うくらいだったら、自分がアセンブリ言語で書いたほうがいいと考えてしまう。
468デフォルトの名無しさん:2007/11/21(水) 16:32:17
&使わないループ変数には付けときゃいいんだよ。
レジスタが空いてないなら勝手に使われないだけなんだから。
469デフォルトの名無しさん:2007/11/21(水) 16:41:02
そういうど素人なコードは書きたくないなあ。
組み込み系だったらつけるのはわかるけど、
それ以外だったら間抜け以外の何物でもない。
下手したらオプティマイザーを混乱させてかえって遅くなることもあるし。
つっても今の処理系だったらみんな無視するだろうから大丈夫とは思うけど。

なので場所を弁えずregister修飾入れているやつはど素人。
470デフォルトの名無しさん:2007/11/21(水) 16:44:13
>>468
逆!逆!よっぽどの理由がない限りつけないのが普通だってば
471デフォルトの名無しさん:2007/11/21(水) 18:50:12
アドレスを取られたく無い時ぐらいしか思い付かん
472デフォルトの名無しさん:2007/11/21(水) 19:08:20
アドレスを取られたくない時ってのが思いつかん
473デフォルトの名無しさん:2007/11/21(水) 19:39:28
gnuのソースなんか付けまくりだぜ
474デフォルトの名無しさん:2007/11/21(水) 20:23:13
太古のソースを後生大事に保持してるからねえ
475デフォルトの名無しさん:2007/11/21(水) 22:12:01
今時のコンパイラなら謹んで無視するだろ。
476デフォルトの名無しさん:2007/11/21(水) 22:21:49
C++ならregister変数でもアドレス演算子が使えた気がする。
477デフォルトの名無しさん:2007/11/24(土) 10:45:17
最適化なんてコンパイラにやらせときゃいいのさ。
いろんな環境に移植するソースで、いちいちregister付けたり
外したりなんて馬鹿らしくてできん。
478デフォルトの名無しさん:2007/11/25(日) 13:08:45
Cでヌルポが(void *)0ってマクロ定義される理由が分からん。
C++では、「ヌルポを(void *)0って定義してはダメ」って記述されてる
本があるけど、その理由も分からん。

結局、ヌルポは、どう理解しておいたらいいのだ?

Cでは、ヌルポの型は、(void *)なの?
C++では、ヌルポの型は、なんだ?
479デフォルトの名無しさん:2007/11/25(日) 13:24:31
C++の本の方は(void *)型の話じゃなくて
0がダメって言ってるだけじゃないの?

C自体も0とは定義してないはず

型は・・・どうなんだろう
強いて言えばvoid *型な気がするけど
480デフォルトの名無しさん:2007/11/25(日) 13:50:17
NULLは0じゃない。0がNULLなんだ。
この法則に則って考えれば、NULLはCでもC++でも0と定義されるべきであり、それ自体は8進定数と言うことになる。
481デフォルトの名無しさん:2007/11/25(日) 13:55:36
>>478の論点は「型は、なんだ?」だと思うが・・・

ちなみになんで8進?
482デフォルトの名無しさん:2007/11/25(日) 14:14:33
ポインタくらい簡単なものが一般的に「ポインタが難しい」とされてるおかげで、C始めたばっかの人が「ポインタが理解できません」と言ってくれるので(難しいとされているので躊躇せずに言いやすい?)面接のときのモグリ排除に大いに役に立っている。
483デフォルトの名無しさん:2007/11/25(日) 14:16:21
それを考えて新人に特別な扱いせずに
普通に変わった変数としてポインタ教えてたら
やっぱり2年目になっても分かってなかった
484デフォルトの名無しさん:2007/11/25(日) 14:16:55
0で始まるから8進数。
485デフォルトの名無しさん:2007/11/25(日) 14:17:15
ポインタって精々理系にとっての微分積分程度のレベルでしょ
486デフォルトの名無しさん:2007/11/25(日) 14:21:10
16進は0から始まりませんか?
487デフォルトの名無しさん:2007/11/25(日) 14:22:53
>>485
いや、分数の割り算程度でしょ
488デフォルトの名無しさん:2007/11/25(日) 14:24:09
微積分マスターよりポインタマスターの方が数段楽。覚えなきゃいけない事項の絶対量が少なすぎる。
489デフォルトの名無しさん:2007/11/25(日) 14:27:41
ポインタって何を覚えるんだ・・・
490デフォルトの名無しさん:2007/11/25(日) 14:31:09
ポインタ(の存在意義)がわかりませんって面接で言ったらなにがわからないのか聞いてくるから
とくとくと語ってみたら面接官涙目になってた。
491デフォルトの名無しさん:2007/11/25(日) 14:32:16
面接官って技術者の人やってんのかー
ウチの会社は総務だか人事だかがやってたなぁ・・・
492デフォルトの名無しさん:2007/11/25(日) 14:44:45
ポインタがわからないって、ものごとの裏側(仕組み)が
どうなってるのか少しも考えてこなかった証拠じゃね?
コンピュータの中で関数がどうやって呼び出されてるのとか、
変数はどうやってわたされてるのとか、
時計の針はどうやってまわるのとか、
えんぴつとか棒付きアイスはどうやってつくるのとか
普通は自分なりに考えてみるものじゃん
493デフォルトの名無しさん:2007/11/25(日) 14:46:38
赤ちゃんはどうやっ(ry
494デフォルトの名無しさん:2007/11/25(日) 14:57:32
>>492
そうやって裏側の裏側の裏側の……って調べていくとキリがないので、
あるところで計算を打ち切ってcall-by-needで遅延的な思考をすることだってあろう。
そのためにいろんな学問やら処理系やらは多層構造になってるし、
インターフェースが決まってれば実装が見えなくたってかまわないんでしょうよ。
コンピュータをやるなら最低でもアセンブラとかマシン語が云々、とかいう人はそこが分かってない。
495デフォルトの名無しさん:2007/11/25(日) 15:03:53
このスレポインタスレだからしょうがないかと思っていた
496デフォルトの名無しさん:2007/11/25(日) 15:19:54
アセンブラ出身の俺からみてポインタはなんであんな面倒な仕組みなのか理解できないよ。
497デフォルトの名無しさん:2007/11/25(日) 15:21:36
おっちゃん乙
498デフォルトの名無しさん:2007/11/25(日) 15:26:45
>>494
違うんだ
具体的な仕組みを正確につきとめるというより
少なくとも自分のなかでつじつまが合うように
モノゴトの裏側を想像するってこと
抽象化して考えることが出来る奴は、少なくとも
具体の一例を想像して挙げてみることができると思う
499デフォルトの名無しさん:2007/11/25(日) 15:38:00
合理的に考えられる奴ならポインタのおかしさ、不自然さに気づくだろうよ
500デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/25(日) 16:08:17
>>486
16進定数は0xで始まらないといけないので、数値0をあらわすには0x0とする必要がある。
502デフォルトの名無しさん:2007/11/25(日) 17:58:23
>>499
kwsk
503デフォルトの名無しさん:2007/11/25(日) 17:59:57
kwsk聞いたら宣言の話だった、というのは無しにしてほしい。
504デフォルトの名無しさん:2007/11/25(日) 18:00:50
8進の0って表記では00じゃないの?
505デフォルトの名無しさん:2007/11/25(日) 18:33:06
どっちでも一緒だからどうでもいいよ、ポインタと関係ないし
506デフォルトの名無しさん:2007/11/25(日) 20:31:04
世の中にポインタと関係ないものなんてないよ
507デフォルトの名無しさん:2007/11/25(日) 22:59:05
Javaにはポインタは存在しないのに
なぜ NullPointerException が出てくるんですか?
508デフォルトの名無しさん:2007/11/25(日) 23:03:29
語呂がいいから
509デフォルトの名無しさん:2007/11/25(日) 23:12:29
>>507
ガッ
510デフォルトの名無しさん:2007/11/25(日) 23:17:32
JavaにポインタがないこととJavaVMにポインタがないことは別だから。
511デフォルトの名無しさん:2007/11/26(月) 18:22:20
ポインタがわからないという概念がわからない
512デフォルトの名無しさん:2007/11/26(月) 20:19:17
概念は分かるけど、使い方が難しい、使いどころが分からないってことなんだろう多分
513デフォルトの名無しさん:2007/11/26(月) 23:54:11
同じことをするのに何通りも方法があるのが混乱のもと。
514デフォルトの名無しさん:2007/11/27(火) 00:38:36
だから、バカ用言語のjavaが出来たのだよ
515デフォルトの名無しさん:2007/11/27(火) 02:53:01
同じ著者?のExcelのVBAの本はわかりやすいのに
こっちは結局よくわからんかった。著者はCを知らないっぽ
http://www.amazon.co.jp/product/dp/4798011924
516デフォルトの名無しさん:2007/11/27(火) 13:53:19
Javaは単に見えなくしてるだけじゃないのか?
517デフォルトの名無しさん:2007/11/27(火) 16:40:33
Javaは全部ポインタなのさ。
518デフォルトの名無しさん:2007/11/27(火) 19:44:39
プリミティブ型はポインタがない。
かつ、オブジェクトでも明示的なアドレス演算ができないという意味では
ポインタとしては不完全。
519デフォルトの名無しさん:2007/11/27(火) 21:33:49
ぷ・・・ぷれみあむがた?
520デフォルトの名無しさん:2007/11/27(火) 21:37:37
アドレス演算なんかあってもしょーがない
521デフォルトの名無しさん:2007/11/28(水) 00:47:47
しょうがないというかJavaにはその概念がないんだからできなくて当然だ。
522デフォルトの名無しさん:2007/11/28(水) 01:33:43
できないからやれないのとできるけどやらないのとの間には越えられない壁がある
523デフォルトの名無しさん:2007/11/28(水) 01:39:01
できないけどやるやつが始末悪い
524デフォルトの名無しさん:2007/11/28(水) 07:01:35
言語仕様上可能だからってやるやつも始末悪い
525デフォルトの名無しさん:2007/11/28(水) 08:10:57
Cでは明示的なアドレス演算がないとプログラムが書けないだけのこと。
526デフォルトの名無しさん:2007/11/29(木) 12:49:27
Cを10年やってきた俺が断言しよう。
ポインタのないC#が理想系にもっとも近い。
C++のように氾濫するライブラリを使いこなすためにキャストの嵐もないし。
527デフォルトの名無しさん:2007/11/29(木) 13:05:36
俺もそう思うー
528デフォルトの名無しさん:2007/11/29(木) 13:10:45
C++を10年やってから言ってください^^
529デフォルトの名無しさん:2007/11/29(木) 13:12:10
aho
530デフォルトの名無しさん:2007/11/29(木) 14:18:08
C++も2〜3年はやってるがこんな扱いづらい言語はないよ。
自分で一から作るならいいけど、実際の現場じゃ色んな人が触ったソースも
見なきゃならないわけで、当然のように色んなライブラリが使われてる。
次から次へと覚えることが多すぎてヘボな俺の頭はついてけないぜ。

あとC++は文字列だけを見てもCString、std::string、System::String*、TCHAR*、WCHAR*、
CAtlString、BSTR、CComBSTRなどなど。おぞましいほど多様な形態がある。

C#だと、ほぼstring型で統一されてるだがなぁ。

C++は使い古されてもうカオス状態。言語としては何でもできる良い言語だけど
俺はもう嫌だ。ボスケテー
531デフォルトの名無しさん:2007/11/29(木) 18:54:21
>>おぞましいほど多様な形態がある。
それはC++のせいではない。
そこの区別がつかないようでは(略
532デフォルトの名無しさん:2007/11/29(木) 19:00:49
CLI(笑)
533デフォルトの名無しさん:2007/11/29(木) 20:26:42
C++は
534デフォルトの名無しさん:2007/11/29(木) 20:38:54
その中でC++の文字列型と言えるのはstd::stringだけじゃねぇ?
535デフォルトの名無しさん:2007/11/29(木) 20:56:17
まぁ C++ は歴史も引きずってて自由でやり放題だからな…
自分でさらっと書くのには Java とかより楽で好きだけど、
他人のコードには手を入れたくないな。
536デフォルトの名無しさん:2007/11/29(木) 21:32:12
おまえのも他人からそう思われてるよ

自分のが一番綺麗だと思ってるうちはまだまだ未熟

537デフォルトの名無しさん:2007/11/29(木) 22:04:30
そういうカオス領域の扱いに長けているのがC++だと思っている。
538デフォルトの名無しさん:2007/11/29(木) 22:28:55
>>536
別にきれいだと思っているとは書いていないよ。勉強して努力はしているが。
できるだけ自分で責任を持って直したいと思ってる。
539デフォルトの名無しさん:2007/11/29(木) 22:36:54
ポインタと関係ないですが
540デフォルトの名無しさん:2007/11/30(金) 01:39:03
趣味でオナニープログラムして楽しむならC++だな。
仕事では、使いたくねぇ
541デフォルトの名無しさん:2007/11/30(金) 02:52:10
>>539
ポインタを語るスレではないからな
そもそも学びたい奴がいないならこのスレいらんだろ
ポインタがわからんやつとかいないじゃん
542デフォルトの名無しさん:2007/11/30(金) 13:07:43
ポインタをどうやって学ぼうかってスレなんだから
ポインタわかんない人も来るだろw
543デフォルトの名無しさん:2007/11/30(金) 17:01:39
ポインタ勉強中でなんとなく面白くなってきた

関数は常に値渡し
参照渡しでも結局はアドレスと言う値を渡してるに過ぎない
って認識であってる?
544デフォルトの名無しさん:2007/11/30(金) 17:06:45
うん
545デフォルトの名無しさん:2007/11/30(金) 19:29:27
C言語は値渡ししかできない、でいいんですよね?
546デフォルトの名無しさん:2007/11/30(金) 19:34:13
今更Cやポインタなんて勉強してるやつはバカだろw

言語なんて勉強する意味がない。
コーダーは中国から買ってくれば良い
547デフォルトの名無しさん:2007/11/30(金) 19:38:14
そうして中国に追いつかれることに気付かない日本人。
私は自分のためにCやポインタを勉強する。
548デフォルトの名無しさん:2007/11/30(金) 19:40:59
お前がバカなんだっつの
549デフォルトの名無しさん:2007/11/30(金) 19:41:40
まともなコードが書けない奴が、まともな設計できるわけねえし
550デフォルトの名無しさん:2007/11/30(金) 19:43:55
他にも勉強する事が多くてなぁ・・・
まともなコードが描ける頃には髪の毛白くなってそうだよ
551デフォルトの名無しさん:2007/11/30(金) 19:47:09
コード書きは全てに優先するんだよ
無知か?おまえ
552デフォルトの名無しさん:2007/11/30(金) 19:48:00
なかなか粗悪な暇の潰し方だな
553デフォルトの名無しさん:2007/11/30(金) 20:02:31
職人みたいに低能頑固薄給視野0になりたければ
コード書けばいいと思うがなw

コーダーなんてインドから集めてくればいい
554デフォルトの名無しさん:2007/11/30(金) 20:04:25
コーダ以外コード書く必要ないと思ってる化石か
555デフォルトの名無しさん:2007/11/30(金) 20:05:04
マ板でどうぞ
556デフォルトの名無しさん:2007/11/30(金) 21:20:07
GoogleやMSの社員もコード書いている件について
557デフォルトの名無しさん:2007/11/30(金) 21:41:59
マネージャクラスでもな
558デフォルトの名無しさん:2007/11/30(金) 21:43:34
それが普通
559デフォルトの名無しさん:2007/11/30(金) 21:47:34
じゃあなんで日本のマネージャクラスはコード書かないのが多いの?
なんで日本の文化ではコード書きは底辺がすることって信じられてるの?
560デフォルトの名無しさん:2007/11/30(金) 21:52:06
typedef void* NULL;

#define NULL 0
561デフォルトの名無しさん:2007/11/30(金) 21:58:37
>>559
それが一番妥当かつ効率性が高いとう結果
なんだよ。結局コードなんて書いても成果を
出しましたって小細工しているにすぎないからな
562デフォルトの名無しさん:2007/11/30(金) 22:01:24
日本語で
563デフォルトの名無しさん:2007/11/30(金) 22:07:28
>>556-558
書くモノしか見てないけど Google とか技術部いい感じだよね。
Norvig さんとか。
564デフォルトの名無しさん:2007/11/30(金) 22:23:07
いい感じじゃねーだろ
565デフォルトの名無しさん:2007/11/30(金) 22:39:04
英語身に着けて外国でもなんでもいけばいい。
コードも書けない奴の言うことなんて誰もきかない。
566デフォルトの名無しさん:2007/11/30(金) 22:49:30
視野が狭すぎてすげーなw
567デフォルトの名無しさん:2007/11/30(金) 23:08:53
昔と比べてコードの抽象度が高いから、自然言語を使う必要性が減ったってことでしょ
コーダにコーディングをアウトソースするときに、インプットとして「コード」が必要になったってこと
昔と大して変わってない
568デフォルトの名無しさん:2007/11/30(金) 23:25:48
今日帰りにインド人がやってるカレー屋に行ったんだけど、
カレー注文したらスプーンがついてこなくて
「あ、本格的な店なんだ」とか思って手で食ってたら、
半分くらい食ったときに、インド人の店員が奥から
すげー申し訳なさそうな顔してスプーン持ってきた
569デフォルトの名無しさん:2007/11/30(金) 23:34:53
>>568
おもしろいコピペがあったら貼るスレinマ板part4
http://pc11.2ch.net/test/read.cgi/prog/1194955716/l50
570デフォルトの名無しさん:2007/12/04(火) 15:03:58
571デフォルトの名無しさん:2007/12/04(火) 17:44:08
>>128
が改悪したようにしか見えない件についてw
572デフォルトの名無しさん:2007/12/10(月) 21:58:52
うおおぉぉ!
Javaばかりでプログラム組んでいてC++にに戻ってきたらメモリ管理だるすぎて泣きそうだw
Javaはメモリ管理が楽だからいいよな
よくC#、Javaはポインタがなくて良いとか言う奴いるけど、これらの言語の利点はメモリ管理の楽さだろと突っ込みたいぜw
それにC#、Javaはむしろポインタの固まりだしな

C++のメモリ管理の経験があると、ガーベジコレクション等に負担をかけず高速なプログラムを組めることが身に染みてわかったぜ、自動解放だからってテキトーに組むとメモリリークは発生しないにしろ遅いなw
結論、C++のようなメモリ周りがシビアな言語をやる価値は今でも十分すぎるほどあると
573デフォルトの名無しさん:2007/12/10(月) 22:40:35
C++ならスマートポインタ使えばいいのに
574デフォルトの名無しさん:2007/12/10(月) 22:52:08
違う違う。

C++ならスマートポインタ実装すればいいのに
575デフォルトの名無しさん:2007/12/11(火) 07:28:30
俺は、自分でメモリ管理しないと、不安でしょうがない。
JavaやC#だと、本当にリークしてないのか不安になってたまらない
576デフォルトの名無しさん:2007/12/11(火) 13:56:30
aho
577デフォルトの名無しさん:2007/12/11(火) 15:47:48
GUIでガベコレの遅延がはっきり感じられるとつらいね
元々もっさりなのに時々かくかくではストレスもたまる
578デフォルトの名無しさん:2007/12/11(火) 16:24:29
なんでそうなるコードを書くの?
579デフォルトの名無しさん:2007/12/11(火) 17:21:57
リソース管理が自動化されてる言語しかやったことがない、とか
580デフォルトの名無しさん:2007/12/13(木) 16:16:38
int array[10];
で&arrayってvoid*?
581デフォルトの名無しさん:2007/12/13(木) 16:52:14
int**
582デフォルトの名無しさん:2007/12/13(木) 17:04:52
自己レス
int (*)[10]か。

>>581
あれ?それでもいいの?
試してみます
583デフォルトの名無しさん:2007/12/13(木) 17:13:53
配列のポインタと、ポインタのポインタを間違えるな
584582:2007/12/13(木) 17:24:09
int**はダメだた・・・
585デフォルトの名無しさん:2007/12/13(木) 17:32:46
>>572
俺にはC++のメモリ管理がだるいと感じるお前が理解できない

new したらdeleteすればいいだけじゃん

なにがだるいんだか・・・

586デフォルトの名無しさん:2007/12/13(木) 17:36:05
それがだるい。
587デフォルトの名無しさん:2007/12/13(木) 18:31:19
>>585
C++のメモリ管理ってスマポンタだろ
588デフォルトの名無しさん:2007/12/13(木) 18:33:31
>>580
配列名だけで先頭要素のアドレスになる。
ただし、それは変数じゃないので&を付けても無駄。

int array[10];

printf("%p¥n", array);
printf("%p¥n", &array);

で試してごらん。
589デフォルトの名無しさん:2007/12/13(木) 18:34:41
>>586
よきにはからえ、じゃないと駄目だよね。
ゆとりプログラミングの時代さ。
590デフォルトの名無しさん:2007/12/13(木) 19:24:19
>>588
arrayは配列の先頭要素へのポインタ
&arrayは配列へのポインタ
だから値は同じだけど意味が違うんじゃないですか?
591デフォルトの名無しさん:2007/12/13(木) 19:51:16
>>589
コンパイラ使うのも似たような言葉で馬鹿にされたものだけどね。
592デフォルトの名無しさん:2007/12/13(木) 21:53:28
>>588
違う。
arrayはポインタでは「ない」。
ポインタは変数。配列名は定数。
593デフォルトの名無しさん:2007/12/13(木) 21:57:39
単にarrayと書いたときに「どう解釈されるか?」の話じゃないの?
594デフォルトの名無しさん:2007/12/13(木) 22:11:13
アレーイ?
595デフォルトの名無しさん:2007/12/13(木) 23:43:50
アルェーイ?
596デフォルトの名無しさん:2007/12/14(金) 10:44:32
配列とポインタは違うのに同じだ、
と言うニュアンスでK&Rで解説されたために、
その後のC言語の入門書で、
よく分ってないヤツがゴチャゴチャにして説明するようになって、
今に至る
597デフォルトの名無しさん:2007/12/14(金) 11:49:52
基本的に違うけど引数としてはどっちでもとれるって状況
だと思うが引数として使うってのが
けっこうメジャーな使いかたなためごっちゃになってるって
状況だとおれは認識してる。
598デフォルトの名無しさん:2007/12/14(金) 11:55:35
>>597
>基本的に違うけど引数としてはどっちでもとれるって状況
間違い。
引き数としては、常にポインタ。
# 但し、Cの場合。
599デフォルトの名無しさん:2007/12/14(金) 12:36:31
学校で課題で「配列とポインタの違いを説明せよ」みたいなのあったなぁ・・・
600デフォルトの名無しさん:2007/12/14(金) 16:41:13
>>585
自分がnewしてdeleteするなら別に面倒では無いだろうけど
リスト構造でなおかつ、その構造が要素追加にnew、削除にdeleteを使うようなプログラムはが何万行と続くとデバック作業がかなり面倒だろ?まあ、それはそれで利点もあるがな

それを面倒臭くないというお前はすごいな、それとも極小規模なプログラムしか組んだことないのかな?
601デフォルトの名無しさん:2007/12/14(金) 17:58:01
>>599
配列は箱を列に並べたもの
ポインタは矢印
でいいかな?
602デフォルトの名無しさん:2007/12/14(金) 18:43:34
>>601
大学のレポートって、お絵かきでOKなの?
603デフォルトの名無しさん:2007/12/14(金) 18:59:17
>>598
そういうことじゃなくてポインタ変数でも配列変数でも
代入できるだろうって意味。
604デフォルトの名無しさん:2007/12/14(金) 19:25:33
住所そのものと住所を書いた紙が別なのは当たり前だろが
住所そのものを変えるには市町村合併でもするほかないが紙に書かれた住所を書き換えるだけなら簡単
605デフォルトの名無しさん:2007/12/14(金) 19:31:58
>>604
なんかオブジェクト指向の例え話なみに微妙な話だな
606デフォルトの名無しさん:2007/12/14(金) 19:50:48
たとえ話に住所って言葉を使うのが間違ってそう
607デフォルトの名無しさん :2007/12/14(金) 19:54:39
ポインタなんて
[C言語 ポインタ完全制覇]
読んで理解したなら
後は、実践を繰り返すだけだろーよ
608デフォルトの名無しさん:2007/12/14(金) 19:56:31
どんなに微妙でも人間の脳構造はアナロジーの利くものの方が
覚えやすくできてんだからそれでいいじゃんよ。
609デフォルトの名無しさん:2007/12/14(金) 20:05:30
C FAQの6.13
http://www.kouno.jp/home/c_faq/c6.html#13
http://c-faq.com/aryptr/ptrtoarray.html

・・・本当に配列そのものへのポインターが必要な場合は「int (*ap)[N];」 のような表現を使う。
 ここでNは配列のサイズを表す(質問1.21も参照)。
 配列の大きさがわからない場合、Nを省略することができる。
 しかし 結果として得られる「大きさが未知の配列へのポインター」は役に立たない。

ってあるんですが、
int array[10];
int (*ap)[];
ap = &arrrayってエラーにならないんですか?
610デフォルトの名無しさん:2007/12/14(金) 20:17:14
>>609
配列の不完全型ってヤツか?
良く分からんが、違う構造体同士で相互参照する時なんかに使う
構造体の不完全型の親戚みたいなもんかな
611デフォルトの名無しさん :2007/12/15(土) 02:27:42
>>609
試せば良いじゃんよ
612デフォルトの名無しさん: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デフォルトの名無しさん:2007/12/15(土) 05:35:26
それも極端な話だなあ、と思う反面確かにそれが近道だよなあと思っているおれがいる
615デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/12/15(土) 12:11:15
>>615
配列の配列とか、配列の配列の配列とか、つまり多次元配列を
関数の引数として渡すときに必要だな
619デフォルトの名無しさん:2007/12/15(土) 12:15:46
>>615
配列名は、配列の「先頭の要素」のアドレス。
配列名に&をつけた場合は配列「そのものの」のアドレス。

ポインタの値としては同じ値だが、意味が違う。

なんか思い違いをしてる気がするぜよ
620615:2007/12/15(土) 12:48:40
>>618
多次元配列も、型と先頭アドレスと要素数を何らかの形で渡せばいいわけだから、
アドレスに関しては配列名のみを渡せばいいんじゃないの?

>>619
意味の違いは理解してるつもりだが、これじゃなきゃできない、というケースが思いつかなくてさ。
先頭の要素のアドレスと、配列そのもののアドレスが違うことがあれば理解もできるってもんだが…
621デフォルトの名無しさん:2007/12/15(土) 13:12:30
&つけようがつけまいが
値同じだから意味は同じ

しょうもねー議論してるんじゃねーよw
622デフォルトの名無しさん:2007/12/15(土) 13:22:07
そんな乱暴なw
623デフォルトの名無しさん:2007/12/15(土) 13:54:30
>>621
型が違うから意味は違うだろ
624デフォルトの名無しさん:2007/12/15(土) 14:29:01
>>621
おまい、ポインタはvoid*さえあればいい派だなw
625デフォルトの名無しさん:2007/12/15(土) 14:51:34
void *と
void **あれば何もいらねーだろ。

型に束縛される書き方してると
汎用性失う言語だし

携帯のドライバなんかは
int Inithoge(void * data1, void *data2, void *data3)
こんなの普通だぞ?
626デフォルトの名無しさん:2007/12/15(土) 15:01:07
携帯用のドライバなんかどうでもいい
627デフォルトの名無しさん:2007/12/15(土) 15:42:40
http://www.kouno.jp/home/c_faq/c6.html#18

>>配列の配列は、ポインターへのポインターに成り下がることはない。
これを読んで思ったんだけど、
int main(int argc, char **argv)は間違い(行儀が悪い)で、
int main(int argc, char *argv[])が正しい(行儀が良い)の?
628デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/12/15(土) 18:45:17
const char* const argv[] って書きたいところだけど
631デフォルトの名無しさん:2007/12/16(日) 06:01:17
ポインタの配列と、配列の配列の違いを、
いくら説明しても全く理解できないヤツ、
会社に一人くらいいるよな・・・

プロのプログラマーのはずなのに
632デフォルトの名無しさん:2007/12/16(日) 06:05:55
・ポインタを「何かを指している矢印」
・配列を「何かが入っている箱」
という図を描いてみて、その上で配列の配列とポインタの配列を描いてみればすぐわかると思うんだけどな。
633デフォルトの名無しさん:2007/12/16(日) 11:13:25
>>631
専門書籍で使われてる言葉をそのまま使っても伝わらないよ
一度日本語に直す、相手に伝わる言葉に直す
そういうリファクタリングを繰り返してバカ矯正プログラムが完成するんだ
634デフォルトの名無しさん:2007/12/16(日) 16:47:55
ダブルポインタと呼ぶのはやめてほしい
635デフォルトの名無しさん:2007/12/16(日) 17:07:40
図ばかり頼りにして、言葉を大事にしないのは、理系プログラマの欠点だ
636デフォルトの名無しさん:2007/12/16(日) 21:45:05
文章から何かをイメージする能力が読む側に備わってない
理系文系だ関係なく読解問題が苦手なの増えてるだろ?
だからこっちでイメージを用意してやりようやく相手が理解できる
マンガと同じだわ
637デフォルトの名無しさん:2007/12/16(日) 22:15:45
そうゆうこと
嫌韓を読めばよくあの国が理解できるのと一緒
638デフォルトの名無しさん:2007/12/16(日) 22:49:12
嫌韓って漫画じゃねえよあれ。カット集じゃん
全編挿絵っつうか
639デフォルトの名無しさん:2007/12/16(日) 23:05:44
マジレスすること自体
ゆとりだと自己主張しているものだな。

このスレ削除でよくねーか?
640デフォルトの名無しさん:2007/12/16(日) 23:08:20
時々思いがけない議論があってちょっと楽しいから
削除しないで放置しておいて欲しい
641デフォルトの名無しさん:2007/12/16(日) 23:13:43
マジレスでもなんでもないだろw
どんどん話題が枝葉にそれてるだけで
642デフォルトの名無しさん:2007/12/17(月) 00:08:20
まず、学ぶべきことを定義するのが先じゃないか?
  アドレスの代入、アドレスが示す値の参照
  関数へのアドレス渡し
  ポインタを利用するアルゴリズムを理解
こんな感じでさ
643デフォルトの名無しさん:2007/12/17(月) 00:14:32
レス600過ぎてから定義されてもwww
644デフォルトの名無しさん:2007/12/17(月) 01:39:57
老いて益々盛んってことわざもあるし
人生に手遅れって言葉はないと思うんだ
645デフォルトの名無しさん:2007/12/17(月) 04:57:57


646デフォルトの名無しさん:2007/12/17(月) 11:54:52
図に書いて説明するより、ソースレベルデバッガでポインタ変数にどんな値が入って、
その値が指すアドレス(とその前後アドレス)にどんな値が入ってるのか
見せた方が分かりやすいと思う。
647デフォルトの名無しさん:2007/12/17(月) 12:32:54
>>646
ポインタの実際の値がいくつなんて、
どうでもよいことじゃね?
648デフォルトの名無しさん:2007/12/17(月) 17:17:05
ポインタをsizeofすると正体がわかるよね
32bitの処理系なら型に限らず全部4だし
649デフォルトの名無しさん:2007/12/17(月) 18:12:01
>647
いや、そういう正体のつかめ無さが、初心者には分かりづらいんじゃない?
まずは抽象度を下げて、具体例から入った方がいい。
650デフォルトの名無しさん:2007/12/17(月) 21:20:39
>>648
ただそんなことに頼っていると書いているコードがしばらくたって
使おうと思うと動かなくなる。
651デフォルトの名無しさん:2007/12/17(月) 23:40:06
ポインタは単純だ
for (int i = 0; dst[i] = src[i]; i++);
がポインタのおかげで
for (; *dst++ = *src++;);
できるだけだ
652デフォルトの名無しさん:2007/12/17(月) 23:59:44
あまり違わない気がする・・・
653デフォルトの名無しさん:2007/12/18(火) 02:16:14
つか、C++使い始めてからポインタなぶるなんて中々無くなったわ
654デフォルトの名無しさん:2007/12/18(火) 02:48:13
関数での受け渡し以外にポインタなんて使う?
655デフォルトの名無しさん:2007/12/18(火) 03:51:26
mallocなどで確保するときに使うよ
656デフォルトの名無しさん:2007/12/18(火) 09:50:06
文字列だってポインタじゃん
657デフォルトの名無しさん:2007/12/18(火) 18:39:02
>>654
自己参照型構造体使ってないのか?素人さん?
658デフォルトの名無しさん:2007/12/18(火) 20:34:35
玄人さんがお見えになったぞ!
659デフォルトの名無しさん:2007/12/18(火) 20:48:28
ポインタ使うのに、玄人も素人もない
660デフォルトの名無しさん:2007/12/18(火) 23:03:10
グローバル変数の初期化順序が保証されてないから、初期化順が重要な
グローバルオブジェクトはポインタだけ定義しといて、初期化関数で順番に
newしていくとか。
(順序が重要なオブジェクトをグローバルにすることの是非は置いといて)
661デフォルトの名無しさん:2007/12/19(水) 01:03:25
>>654
オブジェクトいろいろ弄る時に使うよ。入れ替えたりとか便利。
662デフォルトの名無しさん:2007/12/19(水) 01:33:28
コールバックするのにつかうー

longjumpするのにも使う
663デフォルトの名無しさん:2007/12/19(水) 01:43:57
もう「無いと困る」でいいんじゃね?
664デフォルトの名無しさん:2007/12/19(水) 01:51:40
>>657
データ格納するならデータベース使わね?
組み込みなら、一時的な(親機に渡す日次処理で消えてしまうよな)データの格納に使ったりするけど
今は組み込みもDBの採用が進んでるし
665デフォルトの名無しさん:2007/12/19(水) 01:55:29
それとこれとは話が違う・・・
666デフォルトの名無しさん:2007/12/19(水) 02:02:54
話が違うというか、本物が来ちゃったようだ・・・
667デフォルトの名無しさん:2007/12/19(水) 02:37:02
ポインタ使って2−3木を作りたいと思っているのですが
ここを見ればおkていうサイトとかありませんか?
668デフォルトの名無しさん:2007/12/19(水) 08:24:16
データ構造とアルゴリズムを扱った書籍を買った方がいいと思うね
669デフォルトの名無しさん:2007/12/19(水) 10:32:47
てか作ればいいじゃん
670デフォルトの名無しさん:2007/12/19(水) 10:48:42
自己参照構造体というのを試してみたんだが、メモリの開放が面倒そうだ。
自分を指してる一つ前の構造体のアドレスってどうやって取得するの?
元々そういう風に構造体を作らなきゃダメ?↓みたいな感じで。

typedef struct tree {
struct tree *prev;
struct tree *next;
int x;
} tree_t;
671デフォルトの名無しさん:2007/12/19(水) 10:51:29
駄目
672デフォルトの名無しさん:2007/12/19(水) 10:59:19
自分は初期の頃はtree->next->nextでNULL見つけてtree->nextを解放したら,
tree->nextをNULLにする.ポインタ最初に戻してまた上から見るみたいなことやってたw
双方向だとその辺ずいぶん速くなるよね.
673デフォルトの名無しさん:2007/12/19(水) 11:32:57
>>672
再帰すればいいじゃん。
674デフォルトの名無しさん:2007/12/19(水) 11:44:48
>>672
うん,いまは順方向だけの場合そうやってる.
順j方向リストの場合サーチかけてるポインタじゃなくて
その次に対して操作すると一つ前のアドレスはサーチかけてる
ポインタそのものになるということをいいたかった.
675デフォルトの名無しさん:2007/12/19(水) 12:56:15
>>668 >>669
わかりました、頑張ります!
676デフォルトの名無しさん:2007/12/19(水) 13:35:02
おまいら、1方向の線形リストならもっとうまい手があるだろうが。
あるノードを消す場合は、その後ろのノードを消すノードに上書きして、
後ろのノードをfreeするんだよ。
677デフォルトの名無しさん:2007/12/19(水) 17:35:31
一方向の線形リストなら「上書き」って必要ないでしょ
消すノードの前のノードと後ろのノードを繋げてから
対象ノードをfreeすればいいんじゃないの
678676:2007/12/19(水) 17:39:23
1方向って*prevがないやつか
ごめんなさい
679デフォルトの名無しさん:2007/12/19(水) 17:39:55
おれ677だった
ごめんねごめんねごめんね
680デフォルトの名無しさん:2007/12/19(水) 17:56:32
>>679
許すからキニシナイ。


真面目な話、あるノードを消したければ後ろのノードの内容を上書きして後ろの方の
ノードを消すなんてのは一方向線形リストを扱う時の基本的なアルゴリズムだよ。
先頭からまた検索するなんて、無駄無駄無駄〜!


じゃ、あるノードの前に新しいノードを追加する時はどうすれば無駄がないか
考えてみそ。
681デフォルトの名無しさん:2007/12/19(水) 19:19:59
ポイントを押さえて学ぶべき
682デフォルトの名無しさん:2007/12/19(水) 19:57:24
2次元配列を渡すときに大きさが分からなくて
void hoge(int array[][SIZE])見たいな書き方ができないときは
void hoge(int* array[])か
void hoge(int** array)で書くしかない?
683デフォルトの名無しさん:2007/12/19(水) 20:00:19
動的確保してポインタへのポインタで渡す
684デフォルトの名無しさん:2007/12/19(水) 20:19:36
動的静的関係なくね?
685デフォルトの名無しさん:2007/12/19(水) 20:22:04
渡す側がサイズを知らないってどういうこと?
686デフォルトの名無しさん:2007/12/19(水) 20:26:19
よくあること
687デフォルトの名無しさん:2007/12/19(水) 20:30:01
>>682
また、ポインタと配列がゴチャゴチャになってしまって分からないヤツがきたな
688デフォルトの名無しさん:2007/12/19(水) 20:30:38
受け取る側が渡す側からサイズを教えてもらえないと、2次元として扱うのは無理なのだが
689デフォルトの名無しさん:2007/12/19(水) 20:31:15
番兵くんがいればそうとも限らない
690デフォルトの名無しさん:2007/12/19(水) 20:40:50
もう、なんでもかんでもvoid*で渡して、
後は、渡されたほうの関数の中で好きにすれば、
なんでもOKだ
691682: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デフォルトの名無しさん:2007/12/19(水) 20:49:02
malloc()したときに確保した要素数わかってるんだから、
それを関数に渡せばいいだけだと思うが。
要素数を教えないで、どうやって終端を認識するの?
693デフォルトの名無しさん: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デフォルトの名無しさん:2007/12/19(水) 22:23:32
配列でもポインタが扱える
では無く、むしろ
配列はポインタで処理される
と考えるんだ
695デフォルトの名無しさん:2007/12/20(木) 00:33:27
つか、STL使えよって話だよな
696デフォルトの名無しさん:2007/12/20(木) 20:29:52
OTLもなかなかいいよ
697デフォルトの名無しさん:2007/12/20(木) 20:36:39
ポインタの壁に挫折した人みたい
698デフォルトの名無しさん:2007/12/21(金) 04:26:47
いろいろ書いて実行してみること。
アセンブラしてたからかな?すぐ理解できた。
699デフォルトの名無しさん:2007/12/21(金) 09:21:28
今からポインタ学ぼうって人が「じゃあアセンブラからやろう」って思う訳が無い
700デフォルトの名無しさん:2007/12/21(金) 12:01:32
アドレス変換テーブルの話なんか聞かされて
よけいわけわからなくなっちゃったような奴なら
じゃあアセンブラからやろうと思うんじゃないか
701デフォルトの名無しさん:2007/12/21(金) 14:13:17
やる気さえあればすぐ覚えられる
最長でも1日悩み抜けば覚えられるレベル
厄介なのは、すぐ意気消沈してしまう性格
702デフォルトの名無しさん:2007/12/22(土) 03:07:15
**
をポインタのポインタなどと訳する事で余計に初心者の理解を妨げてるように感じる。
703デフォルトの名無しさん:2007/12/22(土) 03:11:39
じゃあなんて
704デフォルトの名無しさん:2007/12/22(土) 03:29:18
ポインタ(変数|オブジェクト|インスタンス)へのポインタ
705デフォルトの名無しさん:2007/12/22(土) 03:34:15
ようするにポインタへのポインタじゃないか
706デフォルトの名無しさん:2007/12/22(土) 11:26:22
pointer to pointer
「の」は適切じゃないかもな
707 :2007/12/22(土) 11:26:53
ポインタ変数を型とするポインタとか
708デフォルトの名無しさん:2007/12/22(土) 11:35:30
>>707
わけわからん
709デフォルトの名無しさん:2007/12/22(土) 12:45:55
toに引きずられてるアホども
710デフォルトの名無しさん:2007/12/22(土) 13:05:50
ポインタとポインタでいいじゃん

2こ仲良くていいじゃん
711デフォルトの名無しさん:2007/12/22(土) 13:36:43
int x = 1, *px, **ppx;
px = &x;
ppx = &px;

printf("%d %d %d", x *px, **px);
712デフォルトの名無しさん:2007/12/22(土) 13:54:03
>>711
いいたいことは判るが

> printf("%d %d %d", x *px, **px);

printf("%d %d %d", x, *px, **ppx);
713デフォルトの名無しさん:2007/12/22(土) 14:32:04
「ポインタのポインタ」と聞いて、その本質と真意を理解できないおまえらは、頭悪い。
100の言葉をもって、最初から最後まで全てを語りつくさないと理解できないのか?
714デフォルトの名無しさん:2007/12/22(土) 15:04:33
初心者にとっては解りにくいって話が、どうしてそうなる?
715デフォルトの名無しさん:2007/12/22(土) 15:10:02
それは誤解
言葉がわかりにくいんじゃないんだよ
716デフォルトの名無しさん:2007/12/22(土) 15:10:08
ポインタのポインタ の検索結果 約 4,450 件中 1 - 10 件目 (0.02 秒)
http://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 秒)
http://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 秒)
http://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デフォルトの名無しさん:2007/12/22(土) 16:15:03
char *cp;
を「charのポインタ」って言うんだから、
void **pp;
を「ポインタのポインタ」って言ってもいいじゃないか。
718デフォルトの名無しさん:2007/12/22(土) 16:20:44
うん
719デフォルトの名無しさん:2007/12/22(土) 16:23:48
俺char *は「charへのポインタ」と言っているよ。
720デフォルトの名無しさん:2007/12/22(土) 16:25:29
>>717
ポインタ=何かを指す=指向性のあるもの。よって、
char *cp は「char型へのポインタ」
void **pp は「void型へのポインタへのポインタ」
721デフォルトの名無しさん:2007/12/22(土) 16:27:03
うん
722デフォルトの名無しさん:2007/12/22(土) 16:28:10
>>720
それでもいいけどね、「へ」は無くてもいいんだよ。
723デフォルトの名無しさん:2007/12/22(土) 16:35:02
>>720
型は指してないんじゃね?
724デフォルトの名無しさん:2007/12/22(土) 16:43:12
俺も意識して
「〜のポインタ」とか「関数ポインタ」とかじゃなくて
「〜へのポインタ」って言ってる
725デフォルトの名無しさん:2007/12/22(土) 16:48:16
それでも通じるからいいんじゃね
726デフォルトの名無しさん:2007/12/22(土) 16:48:18
「へ」は重要だ。「へ」があることによって、何かを指してると認識できる。
「〜のポインタ」だけだと意味が通じない。

…ということを言いたかった。
727デフォルトの名無しさん:2007/12/22(土) 16:48:59
いや「へ」はなくても通じるんだよ
728デフォルトの名無しさん:2007/12/22(土) 16:53:22
そもそもポインタって何かを指すものじゃん
729デフォルトの名無しさん:2007/12/22(土) 17:32:03
初心者にとって、という話だろ?「へ」はあったほうがいいよ。
既に理解してる人にはどっちでもいい。
730デフォルトの名無しさん:2007/12/22(土) 17:38:55
初心者にとっても有っても無くても同じ。
731デフォルトの名無しさん:2007/12/22(土) 17:56:14
じゃあvoid ***pppはなんていうの?
char ****cpppはなんていうの?
732デフォルトの名無しさん:2007/12/22(土) 19:01:12
そんなものは出てきてはいけないw
733デフォルトの名無しさん:2007/12/22(土) 19:53:13
      ___    ━┓
    / ―\   ┏┛
  /ノ  (●)\  ・
. | (●)   ⌒)\
. |   (__ノ ̄  |
  \        /
    \     _ノ
    /´     `\
     |       |
     |       |
           ___   ━┓
         / ―  \  ┏┛
        /  (●)  \ヽ ・
       /   (⌒  (●) /
       /      ̄ヽ__) /
.    /´     ___/
    |        \
    |        |
734デフォルトの名無しさん:2007/12/22(土) 20:38:12
「への」に1票
735デフォルトの名無しさん:2007/12/22(土) 22:39:37
>>731
void ***pppやchar ****cpppなんて使う機会ない
736デフォルトの名無しさん:2007/12/23(日) 02:26:02
へ へ
の の
 も
 へ
737デフォルトの名無しさん:2007/12/23(日) 04:23:45
>>731
初心者がそんなもの使うかアホ
極論に持って行こうとするなよボケ
738デフォルトの名無しさん:2007/12/23(日) 13:59:37
ダブルポインタでええやん。
739デフォルトの名無しさん:2007/12/23(日) 14:23:10
じゃあダブポで
740デフォルトの名無しさん:2007/12/23(日) 14:23:33
ゾッ
741デフォルトの名無しさん:2007/12/25(火) 02:33:11
**のまま使ってる時点でほとんどクソコードだろ。
ふつうtypedefにするかstructにいれる。
742デフォルトの名無しさん:2007/12/25(火) 09:29:32
いやいや、ある構造体の領域をヒープから確保する関数の場合とか、
**を渡した方が自然な場合もある。
743デフォルトの名無しさん:2007/12/25(火) 13:07:01
どうせならデュアルポインタのほうがかっこよくね?
744デフォルトの名無しさん:2007/12/25(火) 14:07:43
クアッドポインタにオクタポインタっすね
745デフォルトの名無しさん:2007/12/25(火) 17:19:37
ポンタでよくね?響きが萌える
746デフォルトの名無しさん:2007/12/25(火) 17:22:22
ポイポインタ
747デフォルトの名無しさん:2007/12/25(火) 20:46:28
つ[*&]
748デフォルトの名無しさん:2007/12/25(火) 21:01:54
ポインヨ
749デフォルトの名無しさん:2007/12/25(火) 22:06:00
>>745
あのjunkyのおっさんですか?
750デフォルトの名無しさん:2007/12/26(水) 00:05:43
ツインポインタ
751デフォルトの名無しさん:2007/12/26(水) 00:39:04
ポインポイン
752デフォルトの名無しさん:2007/12/26(水) 00:40:28
ポインティングゥー!ポインタァー!!!
753デフォルトの名無しさん:2007/12/26(水) 02:17:22
日本語でいいだろ。「二次ポインタ 」
754デフォルトの名無しさん:2007/12/26(水) 02:42:06
「ポインタ」も日本語にしろ
755デフォルトの名無しさん:2007/12/26(水) 02:46:15
刺す人
756デフォルトの名無しさん:2007/12/26(水) 02:46:48
そういわれればポインタの日本語訳って見かけないね
イテレータは反復子と訳されるのに
757デフォルトの名無しさん:2007/12/26(水) 02:55:56
じゃ、「二次指示子」
758デフォルトの名無しさん:2007/12/26(水) 19:59:17
ポインタの和訳は…そうだな…「オブジェクトリファレンス」ってのはどうだい?
759デフォルトの名無しさん:2007/12/27(木) 03:35:43
参照じゃねーかw
760デフォルトの名無しさん:2007/12/27(木) 05:40:44
その前に突っ込むところがあるだろw
761デフォルトの名無しさん :2007/12/27(木) 07:59:20
ポインタはウルトラマンセブンに出てくる乗り物だよ
762デフォルトの名無しさん:2007/12/27(木) 13:16:11
ウルトラマンのやつは「ポ↓イ↑ン↑タ↓ー↓」
コンピュータ用語のほうは「ポ↑イ↑ン↓タ↓ー↓」
763デフォルトの名無しさん:2007/12/27(木) 14:43:31
違うだろ。
764デフォルトの名無しさん:2007/12/27(木) 16:35:25
和訳なら矢印だな
765デフォルトの名無しさん:2007/12/27(木) 18:19:45
int *ip
int* ip
ptr<int> ip
1番目より2番目の方が、2番目より3番目の方がわかりやすいと思うんだけどどうよ。
766デフォルトの名無しさん:2007/12/27(木) 18:26:25
どうといわれても
767デフォルトの名無しさん:2007/12/27(木) 18:42:59
ポインタ宣言子と間接参照演算子が別の記号だったら混乱起こさなかったのに。
768デフォルトの名無しさん:2007/12/27(木) 19:10:47
C++のスマートポインタはその点で気が利いてる。
Cだと表現しようがないんだけど。
769デフォルトの名無しさん:2007/12/27(木) 19:54:56
いまさら宣言の記法に注文つけてどうなる。
770デフォルトの名無しさん :2007/12/27(木) 20:27:21
宣言の記法に注文付けたい奴は
typedef int* intptr;
とでもしやがれってんだ。
こんな事してるソース見たことはないが
でもwin32apiのソース読むと
typedefしまくりで、あんぐりする。
771デフォルトの名無しさん:2007/12/27(木) 20:54:56
int* p, q;
772デフォルトの名無しさん:2007/12/27(木) 21:47:44
int q, *p;
これと>>771が等価ってのはひどい。
773デフォルトの名無しさん:2007/12/27(木) 21:47:47
>ポインタのポインタ
ハンドル…。
774デフォルトの名無しさん:2007/12/28(金) 06:51:30
>>773
昔のMac以外にそういう呼び方をする流儀ってあるのか
775デフォルトの名無しさん:2007/12/28(金) 07:22:09
>>774
別に流儀じゃなくて、一つのメモリ管理モデルとしてあるわけで。
(MacOSに影響受けているから当然と言えば当然だけど)PalmOSでもハンドルで管理していたし。
776デフォルトの名無しさん:2007/12/29(土) 12:23:49
string使えはええやん。
777デフォルトの名無しさん:2007/12/29(土) 13:04:32
は?
778デフォルトの名無しさん:2007/12/29(土) 16:26:01
CPUエミュレータ作るとき、関数ポインタの配列を使いまくった。
779デフォルトの名無しさん:2008/01/05(土) 06:19:59
クラスのメンバ関数の宣言にvirtualを使用すると関数ポインタになる件に関して
クラスの変数の初期化が面倒だからmemset(this,NULL,sizeof(*this))でうっかりvirtualを含むクラスを初期化してしまうと実行時エラーにw
780デフォルトの名無しさん:2008/01/05(土) 10:19:27
あたりまえやん
781デフォルトの名無しさん:2008/01/09(水) 01:12:26
>クラスの変数の初期化が面倒だから
そういう用途にはmemset使うなってエロイ人が言ってたよ。
782デフォルトの名無しさん:2008/01/09(水) 19:58:20
memsetなんてもうずーっと使ってないなー
783デフォルトの名無しさん:2008/01/09(水) 20:01:49
>>779
>memset(this,NULL,sizeof(*this))
ここでNULL使うのはおかしくね?
784デフォルトの名無しさん:2008/01/09(水) 22:14:45
そもそもmemset()使うのがおかしいからどうでもいいよ。
785デフォルトの名無しさん:2008/01/09(水) 22:47:58
http://www.kijineko.co.jp/tech/superstitions/initialization-by-memset.html
>局所変数、特に集成体を宣言した後、実際に必要かどうかに関わらず、必ず memset でゼロクリアする人は大勢います。
>しかし、そんなコードを見かけたら、それを書いた人のコードはすべて疑ってかかった方がよいかもしれません。
786デフォルトの名無しさん:2008/01/09(水) 22:55:34
構造体単体でもmemsetする奴は危険だよ
787デフォルトの名無しさん:2008/01/09(水) 23:03:41
別にmemsetそのものは危険じゃないよ。
788デフォルトの名無しさん:2008/01/09(水) 23:09:05
する奴は
って書いてある
789デフォルトの名無しさん:2008/01/09(水) 23:10:03
うん、そうだね。書いてあるね。

でもそんなことは関係なしにmemsetそのものは危険じゃないよ。
790デフォルトの名無しさん:2008/01/09(水) 23:12:30
ポインタと全然関係ない話題ですねw
791デフォルトの名無しさん:2008/01/09(水) 23:17:06
struct A a;
memset(&a, 0x00, sizeof(struct A));
もう馬鹿かとw

こんな後に

if( a.hoge != NULL)

とかやってる奴ちょっと来い
ぬっこしてやるから
792デフォルトの名無しさん:2008/01/09(水) 23:20:21
勝手にすればぁ〜
793デフォルトの名無しさん:2008/01/11(金) 05:16:33
局所変数の初期化って不要なの?

struct {
int a;
int b
int c;
} data;

struct data;
data.a = 0;

とやったとき、bとcには何が入っているのか確定してる?
794デフォルトの名無しさん:2008/01/11(金) 06:47:12
もちろん不定
795デフォルトの名無しさん:2008/01/11(金) 07:40:39
>>793
スレ違い。まぁ、そもそもコンパイル通らないだろうからどうでもいいけど。
796デフォルトの名無しさん:2008/01/11(金) 09:06:04
構造体を初期化するのにmemset()を使わないなら、memset()なんて何に使うのさ?
そもそもゼロクリアなんていらねーよ、って話?
797デフォルトの名無しさん:2008/01/11(金) 10:27:06
>>796
そもそも NULL == アドレス0 って保証はないわけなんだが
798デフォルトの名無しさん:2008/01/11(金) 11:20:52
>>797
メンバにポインタが含まれる構造体の話か。でもそれなら、

struct DATA data[10] = {0};

という書き方も正しい保障は無いということになるよね。どうすりゃいいの?
799デフォルトの名無しさん:2008/01/11(金) 12:05:18
={0} は正しい。memsetでゼロクリアするのとは異なる。
800デフォルトの名無しさん:2008/01/11(金) 12:14:52
801デフォルトの名無しさん:2008/01/11(金) 13:42:40
>>800
void *p = 0;
などとしたとき、p はアドレス 0 を指すわけじゃないぞ。
定数 0 は処理系依存のヌルポインタのビットパターンを作り出す。

struct DATA data = {0}; は、構造体 DATA の各メンバを
定数の 0 (ビットパターンが 0 なわけではない) で初期化するから、大丈夫だよ。
802デフォルトの名無しさん:2008/01/11(金) 18:47:35
釣られすぎ
803デフォルトの名無しさん:2008/01/11(金) 22:09:46
なるほど、釣りだったということにしたいわけか
804デフォルトの名無しさん:2008/01/11(金) 22:26:20
ヌルポ インタ
805デフォルトの名無しさん:2008/01/12(土) 00:41:13
>>804
ガッ
806デフォルトの名無しさん:2008/01/14(月) 13:46:21
今はVSでクラスなんかをガシガシ使ってるから使わないけど、
一昔前にUNIXで開発してた頃はstructでデータ構造を設計して、
使用時には
memset(&data, 0x00, sizeof(data));
などのように初期化してから使う、というのが常套句だったよ。俺は。
807デフォルトの名無しさん:2008/01/14(月) 15:09:53
はい、スレの皆さん
新年特別DQN >>806入りました〜

かわいがってやってください。w
808806: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));
809806:2008/01/14(月) 17:21:05
>>807
かなりはしょってるが、上のレスのようにやってた。
DQN?俺がDQN?
他人に頼らず、テメーだけの力で批判でも何でもしてみろや。
他力本願な口だけ野郎。
810デフォルトの名無しさん:2008/01/14(月) 17:35:52
コンストラクタで初期化してメンバは隠蔽した方がいいと思う
811デフォルトの名無しさん:2008/01/14(月) 17:53:10
【虎の威を借る狐】

他人の権勢に頼って威張るザコのたとえ
812デフォルトの名無しさん:2008/01/14(月) 18:12:21
>>809
本当にそんな汎用性のないキモイおもちゃ作り
ずっとやってたの?w

取得関数とかクエリ合わせてチューニングも
選択もできねーしこんな設計じゃ拡張性もない

ゴミすぎるだろw?
813デフォルトの名無しさん:2008/01/14(月) 18:24:30
>>806
WindowsAPIのほとんどは今もそうだね
814デフォルトの名無しさん:2008/01/14(月) 18:46:28
>>809
DQNかどうかは兎も角、>808を書いている時点でお郷が知れている。
815デフォルトの名無しさん:2008/01/14(月) 18:53:08
やっぱり>>806は痛い奴だったか
そんな臭いがプンプンしたしなぁ

反論してみ?
816デフォルトの名無しさん:2008/01/14(月) 18:58:26
お前のかあちゃんデベソ
817デフォルトの名無しさん:2008/01/14(月) 18:59:35
きさまっ!いってはならないことをぉおぉぉおおおお
818デフォルトの名無しさん:2008/01/15(火) 00:06:55
環境や用途によってやり方は違うだろうに「キモイ」って評価しちゃう奴はある意味スゲェと思う。
819デフォルトの名無しさん:2008/01/15(火) 00:23:30
>>818
OSS宗教様達は多いよ
リーなんちゃらという変態指導者の
影響だろうけど

自分達の受け入れたくないコード=グロ
って定義だし。
820デフォルトの名無しさん:2008/01/15(火) 00:35:04
実際見たら、グロなんだろ。
821デフォルトの名無しさん:2008/01/15(火) 01:31:10
グロいものほど美味い。これは定説です。
822デフォルトの名無しさん:2008/01/15(火) 07:03:52
ポインタ使った事無いから事故にならなかったんだろ。

こっそりやってるなら、どうせわからないからいいけど、
堂々と自慢されると、やっぱりな、あれだよ・・・
823796:2008/01/15(火) 09:15:50
よーするに、memset()は使い道が無いってことかい?
824デフォルトの名無しさん:2008/01/15(火) 10:40:09
>>823
環境依存でもよくて、標準の真っ当なコードに較べれば多少は速いかもしれないコードを使いたくて、
Intrinsicが用意されていないか使えなくて、インラインアセンブラが用意されていないか使えなくて、
他の手段が見つからないか、過去の遺物を使う為に必要。
825デフォルトの名無しさん:2008/01/15(火) 12:05:51
とりあえず書いとけば誰かが直してくれるさ
826808:2008/01/15(火) 14:26:44
まともな反論は>>812くらいか。
かなりはしょってて共通の関数なんかをすべて省いてるから>>812の感想はもっともだけど、
実際の事務処理アプリの現場ではその「キモイおもちゃ作り」とやらが蔓延していたのもまた
事実としてあるんだから、自分だけ高みから見下して一蹴してしまうすような>>812は、俺には
少し世間知らずに見えてしまうな。

>>815
「やっぱり」ってなんだ?
テメーで反論せずに誰かに反論してもらって「やっぱり」って思ったの?
まさに>>811に出てる「虎の威を借る狐」=ザコだなお前。
あと「反論してみ?」って見下してるけど、テメーは何も言ってないよねw

なんなんだお前は〜w
827デフォルトの名無しさん:2008/01/15(火) 14:27:45
こんなネタで盛り上がれるお前らの時間の贅沢な使い方に脱糞
828808:2008/01/15(火) 14:31:40
このスレ、極少数は経験も知識も豊富っぽいのがいるかも知れないけど、
その他はザコばっかだね。しかも性格が悪すぎ。
>>806に対しての>>807は何だ。
知識も経験もないけど一方的に悪口言ってストレス解消ですか?
反論したいならテメーでしろ。
できないなら実のある話しろやボケ。
だから過疎るんだよこの板。
829デフォルトの名無しさん:2008/01/15(火) 14:33:00
うん。
830デフォルトの名無しさん:2008/01/15(火) 15:49:25
血圧が高いんじゃない?
高血圧は万病の元だよ。
まじで心配
831デフォルトの名無しさん:2008/01/15(火) 17:50:03
>>828
で、ちみはポインタの何がわからなくて躓いてるんだ?
832デフォルトの名無しさん:2008/01/15(火) 18:12:13
ポインタとmemsetって関係なくね?
833デフォルトの名無しさん:2008/01/15(火) 18:19:10
もとは、ポインタをビットパターン0にしちゃだめだろ、って話だったけどな。
834デフォルトの名無しさん:2008/01/15(火) 19:26:38
>>810といい、>>816>>817の自作自演といい、ガキが多いのは感じる
ゆとりって言葉は嫌いだけどつい使ってしまいそうな程
835デフォルトの名無しさん:2008/01/15(火) 19:31:55
memsetの話出てからこのスレつまんなくなった
836デフォルトの名無しさん:2008/01/15(火) 19:48:20
どこまで行けば面白くなるのか遡ってみたら>>1に到達してしまった
837デフォルトの名無しさん:2008/01/15(火) 19:51:28
>>834とか>>828あたりで十分面白いだろ。
838デフォルトの名無しさん:2008/01/15(火) 21:15:09
結局memsetで初期化することの問題点は、
浮動小数点数やポインタの内部表現が環境依存であるから
0.0やNULLに初期化されるとは限らないということだけ?
839デフォルトの名無しさん:2008/01/15(火) 22:02:23
>>838 そだよ
つか, memset なんて組み込みやるときの bss の初期化にしか使った事ねぇし…
840デフォルトの名無しさん:2008/01/16(水) 12:36:15
某A賞のシステムでもそんなの誰も気にせずmemsetしてるけどな
841デフォルトの名無しさん:2008/01/16(水) 13:14:03
Cでgotoは絶対に使ってはいけない、という神話に似てる
842デフォルトの名無しさん:2008/01/16(水) 13:51:46
>>835-837
m9(・∀・)自作自演だろ!!

違うかな?
たぶん>>816-817と同一人物と見た。もしこの推測が合っていたら、
おまいは姑息で卑怯なこざかしい人ですね
843デフォルトの名無しさん:2008/01/16(水) 14:04:59
まじで病院行け。
844デフォルトの名無しさん:2008/01/16(水) 14:44:02
835は俺です
他は違います
845デフォルトの名無しさん:2008/01/16(水) 15:18:02
頭のおかしい人にマジレスしてもw
846デフォルトの名無しさん: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デフォルトの名無しさん :2008/01/18(金) 16:55:30
memsetだってwin32api使ってたらよく使うし
まぁ、ようは、どんな関数でも使う奴しだいだろ
849デフォルトの名無しさん:2008/01/18(金) 22:05:01
ほとんど見かけないようなプラットフォーム向けにも移植性を確保しておきたいかどうかだな
zlibみたいなライブラリではそうする価値があるかもしれないが、俺が書くようなコードではどうでもいい…
850デフォルトの名無しさん:2008/01/18(金) 22:27:36
>>849
スピード命のコードだと, 内周ループで数エントリの構造体を
memset するのってやたらコストがでかい。
実際には、サブルーチンコールのオーバーヘッドがでかいんだが…

去年 MPEG 関連の仕事を途中から引き継いだんだけど、とろくって
使い物にならなかった元のコードの memset を代入文に変えただけ
で実行時間 60% 程度まで短くなった。
851デフォルトの名無しさん:2008/01/18(金) 22:35:04
それは使っているコンパイラが悪いような希ガス。
852デフォルトの名無しさん:2008/01/18(金) 22:35:30
>>850
memset初期化を使うのは、システム起動時か、再起動時でしょ。
あとはオブジェクトが生成されたときとか。

頻繁に生成、破棄を繰り返すようなオブジェクトで、システム上重要な
パフォーマンスに影響をあたえるものにたいして、memset初期化をするかしないか
というのは「高速化」の話。memset初期化のよしあしの話ではない。
853デフォルトの名無しさん:2008/01/18(金) 22:35:42
>>850
まぁそれはまた別の話かと
854デフォルトの名無しさん:2008/01/18(金) 22:54:00
>>851
それは言えてるんだが、組み込み物ではコンパイラの選択肢は限られる。
ましてや、クライアント指定のコンパイラだ

>>852
> システム上重要なパフォーマンスに影響をあたえるもの
に、対して memset で初期化しておいて、直後にその大半を意味のある
値で再度上書きしてた。
> よしあしの話ではない。
かもしれないが、元のコードを書いた奴の神経をうたがったわな。
855デフォルトの名無しさん:2008/01/18(金) 22:57:38
Win32APIみたいに設定項目が山のようにあり、
常に全部を使うわけでもなく、
0で埋められる項目の頻度が高ければ十分ありだろ。
C/C++以外では今時クラスインスタンス0フィルされる言語も珍しくもないし。
ケースを指定するでもなく一般論としてあーだこーだいってる奴はアフォ。
856デフォルトの名無しさん:2008/01/18(金) 23:11:50
>>855
いいえ。

高が、struct someStruct foo = {0} で済むことのためにmemset()を使う必然性は殆どありませんね。
それがstruct someStruct * foo = malloc(sizeof(* foo))した領域でも同じこと。
857デフォルトの名無しさん:2008/01/18(金) 23:29:25
memset使わないで

struct someStruct * foo
何か処理
foo = {0};って感じでまた初期化すればいいだけ

memset使うやつは馬鹿今の公開されている
まともなソースでmemset使ってるのコードは皆無だぞ?
858デフォルトの名無しさん:2008/01/18(金) 23:31:27
>>857
>foo = {0};
それ無理じゃね
859デフォルトの名無しさん:2008/01/18(金) 23:38:01
0fillがいかんからmemsetがいかんに話がずれてきてるな
860デフォルトの名無しさん:2008/01/18(金) 23:38:59
パフォーマンスだけに限って言うと、memsetをインライン展開するコンパイラなら使う事もある。
861デフォルトの名無しさん:2008/01/18(金) 23:50:15
>高が、struct someStruct foo = {0} で済むことのため

宣言と同時に初期化しない場合はどうするの?
というよりこれってコンパイラ依存なんじゃないの?
862デフォルトの名無しさん:2008/01/18(金) 23:51:49
memsetは危険だから使うなって
manとかMSDNに記述あるんだな
863デフォルトの名無しさん:2008/01/18(金) 23:54:46
>>862
具体的に書いてくれ。調べるの面倒
864デフォルトの名無しさん:2008/01/18(金) 23:55:37
お前は何を言っているんだ
865デフォルトの名無しさん:2008/01/19(土) 00:05:01
manページより:

>説明
>memset() は s で示されるメモリ領域の先頭から n バイトを c で埋める。
>返り値
>memset() は s へのポインタを返す。
>準拠
>SVr4, 4.3BSD, C89, C99, POSIX.1-2001.

俺の目がおかしいのかもしれないが危険性がどこにもみつけられない。
MSDNとか読むきしないから他のヤツよろしく。
866デフォルトの名無しさん:2008/01/19(土) 00:09:13
>memset() は s で示されるメモリ領域の先頭から n バイトを c で埋める。
これは嘘だろw
nバイトをcで埋める可能性もあるが正解
867デフォルトの名無しさん:2008/01/19(土) 00:10:50
>>866
日本語でおk
868デフォルトの名無しさん:2008/01/19(土) 00:13:06


          冬 真 っ 盛 り 
 
869デフォルトの名無しさん:2008/01/19(土) 00:15:43
埋めない可能性もあるのか?
まぁSEGVるかもしれんが
870デフォルトの名無しさん:2008/01/19(土) 00:18:25
>>869
>まぁSEGVるかもしれんが

>>866がそんなことで「埋めない可能性がある」とかバカなこというわけないじゃないか。
>>866は、きっともっと違った根拠があっていってるのだよ。
871デフォルトの名無しさん:2008/01/19(土) 00:19:58
ECCメモリを使っていない場合に起こるのかもしれないなw
872デフォルトの名無しさん:2008/01/19(土) 00:27:17
>>871
ワロスwww
その「可能性」言い出したら、マニュアルなんて書けない気がするがwww
873デフォルトの名無しさん:2008/01/19(土) 00:28:46
釣り堀だなw
874デフォルトの名無しさん:2008/01/19(土) 00:35:45
>>867-873
こんなに釣れた
875デフォルトの名無しさん:2008/01/19(土) 00:40:41
>>874
トイウコトニシタイノデスネ
876デフォルトの名無しさん:2008/01/19(土) 12:18:16
struct someStruct foo = {0}
これはできるけど、動的確保した構造体だと無理じゃね?
877デフォルトの名無しさん:2008/01/19(土) 12:21:34
>>876
C99は可能
お前あほ杉w
878デフォルトの名無しさん:2008/01/19(土) 14:00:41
>>876
struct someStruct * foo = malloc(sizeof(* foo));
struct someStruct blank = {0};
* foo = blank;
よほど気の利かないコンパイラでもなければ、blankの実態は作られない。
879デフォルトの名無しさん:2008/01/19(土) 14:06:25
なんと言う糞コードというか糞スレ・・・
880デフォルトの名無しさん:2008/01/19(土) 14:14:39
>struct someStruct blank = {0};

こんなコンパイラがサポートしている「かもしれない」機能を
「使わないのはおかしい」と主張されてもな。
881デフォルトの名無しさん:2008/01/19(土) 14:20:18
>コンパイラがサポートしている「かもしれない」機能
そうなの?
882デフォルトの名無しさん:2008/01/19(土) 14:21:52
>>880
サポートしていないコンパイラをご存知ならご提示くださいませ。
以後規格外品として、広く存在を知らしめてまいりたいと思いますので。
883デフォルトの名無しさん:2008/01/19(土) 14:22:15
>>881
そうだよ
884デフォルトの名無しさん:2008/01/19(土) 14:23:16
>>882
むかし使ってた、ARMの純正コンパイラではサポートされてなかったな。
885デフォルトの名無しさん:2008/01/19(土) 14:23:35
>>882
組み込み業界じゃザラにあるが…
886デフォルトの名無しさん:2008/01/19(土) 14:24:52
もし論点があってそれを覚えているのなら3行にまとめてくれたまへ
887デフォルトの名無しさん:2008/01/19(土) 14:26:15
つまり、昔のARM純正コンパイラは構造体の初期化ができないと?
888デフォルトの名無しさん:2008/01/19(土) 14:26:47
>>884, 885
つか、>>882 は「Cが処理系に依存しない高級言語だ」って
思ってる可愛そうな奴なんだよ
889デフォルトの名無しさん: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デフォルトの名無しさん:2008/01/19(土) 15:42:06
お前らまずは日本語を学べ
スレタイが読めるようになったらまた来い
891デフォルトの名無しさん:2008/01/19(土) 19:37:52
ポインタは友達!
892デフォルトの名無しさん:2008/01/19(土) 21:53:40
ポインタ「げ。また>>891だよ・・・マジウザイ・・・
893デフォルトの名無しさん:2008/01/20(日) 01:38:56
ひでえw
894デフォルトの名無しさん:2008/01/20(日) 20:51:06
昔記事を見て馬鹿にしてた教材が一番わかりやすかった
895デフォルトの名無しさん:2008/01/20(日) 22:18:11
memsetを使う利点は使い方によっては構造体の初期化のソースを短く出来る事かな
巨大な行列を持つ構造体を初期化するとか普通に代入でまかなうとマジで馬鹿にならないくらいソースが膨らむから
ループで回して初期化するのも遅いしな
896デフォルトの名無しさん:2008/01/21(月) 00:52:45
Cプログラマ必須テキストです!

http://mori.eco.to/
897デフォルトの名無しさん:2008/01/21(月) 01:23:47
>>896
どうでもいいのだが・・・
>当然ですが、あらゆる標準関数の使用を認めません。
>
>・strlen() を自作せよ。
>・strcat() を自作せよ。

標準関数の使用を認めないくらいなら、strlenとかstrcatとかキケンな
関数じゃなくて、ふつうはもっと安全な代替関数を自作するでしょ。
898デフォルトの名無しさん:2008/01/21(月) 02:16:15
>>896
>C++未経験ながら、1人でC++の10万行のソースコードの保守及び、3万行の開発を行った。
これ単にCとして使ったとかじゃ
899デフォルトの名無しさん:2008/01/21(月) 02:38:15
いまどき行数で規模示すなんて

クラス数と各クラスのメソッド数で競ってくれ

っつーかすれ違いか
900デフォルトの名無しさん:2008/01/21(月) 02:57:11
競うなよ。どっちも少なければ少ないほど良い。
901デフォルトの名無しさん:2008/01/21(月) 05:07:32
さすがにクラスは適切な数ってのがあるだろうな。
902デフォルトの名無しさん:2008/01/21(月) 11:28:41
>>896は宣伝でマルチしてるから無視すべし
903デフォルトの名無しさん:2008/01/21(月) 17:02:57
PIC等の単純なCPUで機械語でもやってアドレッシングモードを習えば
ポインタは理解出来るんじゃね? 余計に混乱するかな?
904デフォルトの名無しさん:2008/01/21(月) 18:50:37
PICとかアドレッシングモードとかわけわかめなんだけどどうすれば習えるの?
905デフォルトの名無しさん:2008/01/21(月) 19:33:40
PICは余計なところが気になりすぎ、16ビット以上推奨だな。
AVRとかHC08とかARMがいいんじゃね?

あと、アセンブラのアドレスはせいぜい指してる先のバイト数
の情報くらいしか持ってないから、ポインタまでには、まだまだ
壁があるのでよろしく。
906デフォルトの名無しさん:2008/01/21(月) 20:47:32
>>895
おれは構造体を定義したら、必ずその初期化関数を作るけどな。
だからソースはさほど膨らまない。

まあその関数の中でmemsetをやっている場合もあるんだが、
それでも素のmemsetは使わないな。
907デフォルトの名無しさん:2008/01/21(月) 21:43:28
動的にその行列のサイズが変わる、その平均が100X100から1000X1000近くになって
最悪5千近くなる行列は動的に変わるんで代入じゃ無理だし、ループでまわして初期化するよりはmemset使った方が速度は確保できるし
何が糞なんだかなぁと思うわw
まあ、動的に確保して中身をゼロクリアしたいのならcalloc使えって話だけどなw
しかし、途中で初期化したくなったらmemsetかな?
908デフォルトの名無しさん:2008/01/21(月) 22:09:00
>>905
> あと、アセンブラのアドレスはせいぜい指してる先のバイト数
> の情報くらいしか持ってないから
TRON chip を否定したな!WwwWW
909デフォルトの名無しさん:2008/01/21(月) 22:47:17
>>908
> TRON chip を否定したな!WwwWW

は? TRON Chipのポインタも、持ってる情報はアドレスだけですが?

ポインタに情報を持たせるのはLisp処理系とかで、ワードアラインの都合で
使わない下2bitに型の情報を入れ込んだりとか、アドレスが24ビットだった
68000用のやっぱりLisp処理系で上8bitに型の情報を入れたり、とか。

ポインタが本格的に(?)型の情報を持ってるアーキテクチャったらIBMの
System/38→AS/400とかだろ。
910デフォルトの名無しさん:2008/01/21(月) 23:12:54
>>909
ショボいCPU使ってプログラムを作ると自分でポインタを作って管理しなきゃいけなくなるよ。
それでポインタがマスター出来るだろうと思う。
911デフォルトの名無しさん:2008/01/22(火) 01:11:14
>>907
そういう0クリアする必要があるときのmemsetには、誰も異論を唱えていない。
912デフォルトの名無しさん:2008/01/22(火) 01:16:18
>>907
それやるとどこか1バイトだけ
初期化されず危険というコンパイラもある
913デフォルトの名無しさん:2008/01/22(火) 01:24:46
>>912
「そうする機能を持つ」ということと、「バグでその機能が働かない」というのを
ごっちゃにすると、ワケワカンナクなるからやめようぜ。
914デフォルトの名無しさん:2008/02/11(月) 18:52:45
>>909
本家本元のLispマシンを忘れてるぞ。

っていうかアドレスの使ってないビットにむりやり型情報詰め込んだりしてんのも
Lispマシンからの処理系移植のために苦肉の策で
はじまった事じゃないか。
915デフォルトの名無しさん:2008/02/15(金) 22:39:08
nt aref(int **a, int i, int j)
{
return a[i][j];
}
int test() {
extern int array[3][5];
return aref(array, 0, 0);
}
コンパイル時に
passing argument 1 of 'aref' from incompatible pointer type
って怒られるのはなぜ?
916デフォルトの名無しさん:2008/02/15(金) 23:15:49
>>915
エラーメッセージが指摘しているように、関数arefの第一引き数の型が違うから。
917デフォルトの名無しさん:2008/02/15(金) 23:18:41
>>915
こうすればおk
int aref(int (*a)[5], int i, int j)
918デフォルトの名無しさん:2008/02/16(土) 13:44:42
>>917
つ、ことはですねぇ…
コンパイラは int array[3][5]; を 1 次元の配列と認識してるで ok?
919デフォルトの名無しさん:2008/02/16(土) 13:53:28
>>918
int[5] が3つある1次元配列という認識なら、正しい。
920デフォルトの名無しさん:2008/02/16(土) 14:05:35
>>919 つ, ことは
aref の a に渡す変数は

int i; char a[3][5]; char *ap[3];
for (i = 0; i < 3; ++i)
ap[i] = &a[i];

で, 出来たポインタ配列以外は × って認識で ok?
921デフォルトの名無しさん:2008/02/16(土) 14:11:18
ポインタの配列と
配列の配列をごっちゃにするな
922デフォルトの名無しさん:2008/02/16(土) 14:13:12
>>920
bad
923デフォルトの名無しさん:2008/02/16(土) 14:24:59
>>920
おまいさんは配列の配列なんぞを使わずに、一次元配列二次元的にアクセスすることを覚えた方がいいよ。
924デフォルトの名無しさん:2008/02/16(土) 14:53:12
>>920
以下の3つの違いを明確に理解せよ。
特にメモリ上でどう表現されるかについて考えるといい。
  (a) 3つの int[5] からなる配列 int a[3][5]
  (b) 3つの int* からなる配列 int* a[3]
  (c) int[5] へのポインタ int (*a)[5]

(a) と (b) は似たようにアクセスできるかもしれないが全くの別物。
(a) から (c) に自動変換が効くのは一般の配列の場合と同様。
925デフォルトの名無しさん:2008/02/16(土) 15:29:16
>>924
>   (c) int[5] へのポインタ int (*a)[5]
なるほど…
ありあがとう, やっと意味がつながりました。
926デフォルトの名無しさん:2008/05/04(日) 05:23:11
NULLポインタは0とは限らないといってる奴がいたのだが
空ポインタが0以外の処理系とか存在するのか?
927デフォルトの名無しさん:2008/05/04(日) 06:55:58
>>926
http://www.kouno.jp/home/c_faq/c5.html#17
あるけど、内部ビットパターンがそうであるというだけで、
Cのソースコード上は0(がポインタ型にされたとき)がヌルポインタということは常に成り立つ。
928926:2008/05/04(日) 17:12:15
>>927
なるほどです。処理系はともかくANSI Cは0で決まっているようですねw
ありがとうございました。
929デフォルトの名無しさん:2008/05/05(月) 20:08:58
ヌルポインタを数値型にキャストしたとき0じゃないかもしれないんだっけ?
boolは0だよな
930デフォルトの名無しさん:2008/05/07(水) 10:19:09
>boolは0だよな
いいえ、boolは型です。
931デフォルトの名無しさん:2008/05/17(土) 23:14:10
ヌルポインタをboolにキャストした場合を言ってるんじゃないか?
でもfalseのビットパターンって全0だったっけ。
932デフォルトの名無しさん:2008/05/24(土) 07:50:35
>931
falseのビットパターンは全0で正解。
残念ながらNULL pointerをbool型にキャストした場合にfalse(全0)になる保証はない。
ifやforの条件部にpointer型を使用した際に、それがNULL pointerのときかつそのときのみfalse扱いになるのは別の仕組みによる。(C FAQなどに詳しい説明あり。)
933デフォルトの名無しさん:2008/06/02(月) 03:43:07
C言語なら俺に聞け(入門篇) Part 29
http://pc11.2ch.net/test/read.cgi/tech/1212329099/
934デフォルトの名無しさん:2008/06/11(水) 14:59:18
>>9に同意。
プログラミングのセンスがないやつがプログラミングを続けても
たぶんどこかで脱落する。
少なくとも劣等感にまみれた人生になると思ふ。
935デフォルトの名無しさん:2008/06/14(土) 10:21:59
「一般の」「あらゆる」「全ての使い方での」
ポインタなんて考えると、手に負えなくなる。
自分の良く使うアルゴリズムに使うときの
パターンを手コピーしながら覚えるのが
結局は使いこなしにも良い気がする。
定番の型を何度も使っているうちに
やがて脳内に回路が育ってくる、
そういうのでいいんだと思う。
ポインタに限らないけど。
 野生のポインタ…
 それは ぬるぽ
936デフォルトの名無しさん:2008/06/14(土) 11:49:28
それは理解できないやつの負け惜しみ。
937デフォルトの名無しさん:2008/06/14(土) 19:05:37
ポインタって理解すると何が難しかったのか
よくわからなくなるとこが厄介な気がする。
938デフォルトの名無しさん:2008/06/14(土) 20:53:14
難しいところなんかない
939デフォルトの名無しさん:2008/06/14(土) 23:18:55
ポインタの絡んだ宣言が、最初はわかりにくいかもしれん。
940デフォルトの名無しさん:2008/06/14(土) 23:49:08
ポインタの概念自体が難しいってより、
複雑なデータ構造とか、デバッグとか、そっちじゃないかね
941デフォルトの名無しさん:2008/06/15(日) 11:26:44
「int型」のポインタ変数p って覚えるからごっちゃになるらしい。
「int型のポインタ変数」p って覚えれば割とすんなり覚える。

だから教えるときは int *p; より int* p; で教えてる。
942デフォルトの名無しさん:2008/06/15(日) 14:10:45
まぁ、そういう考え方もあるのか〜、と。
943デフォルトの名無しさん:2008/06/15(日) 14:17:23
intとintポインターは別物
944デフォルトの名無しさん:2008/06/15(日) 15:01:03
http://www.cc.kyoto-su.ac.jp/~yamada/programming/pointer.html
> int* p, q, r; /* ポインタ変数なのは p だけ */

根本的に発想が違うからややこしい
945デフォルトの名無しさん:2008/06/15(日) 15:11:44
誤りはなさそうだが、
ポインタ初学者向けの記事だとしたらひどい内容だな。
946デフォルトの名無しさん:2008/06/15(日) 15:23:43
そもそも、ポインタを理解できてない香具師に限ってアドレスを持ち出したがる傾向がある。
947デフォルトの名無しさん:2008/06/15(日) 15:26:16
そうか? ってか、実生活ではポインタわからんなんて奴はいないな。

じーっと黙ってるだけなで、向かいの居乳のIさんは、ポインタをおそる
おそるナデナデしてんのか?
948デフォルトの名無しさん:2008/06/15(日) 15:28:34
>>947
日本語でOK
949デフォルトの名無しさん:2008/06/15(日) 15:32:15
Yeah, I'm speaking Japanese now, huh?
950デフォルトの名無しさん:2008/06/15(日) 15:33:00
>じーっと黙ってるだけなで
951デフォルトの名無しさん:2008/06/15(日) 15:35:00
okey, drop "な"
952デフォルトの名無しさん:2008/06/15(日) 21:59:15
ポインタ脳特有の同化現象だな
953デフォルトの名無しさん:2008/06/16(月) 09:12:07
概念がわかっても表現方法が糞なせいでつまづく。
954デフォルトの名無しさん:2008/06/24(火) 20:04:03
ポインタ=(アドレス保持,型情報)
955デフォルトの名無しさん:2008/06/26(木) 21:22:19
Cならアドレスに毛がは得たものだと思っておけばいいが
C++だと配列newとか仮想関数とかあるからな…
956デフォルトの名無しさん:2008/06/30(月) 02:34:27
ヌルポインタの内部表現は 0とは限らないから
「構造体をmemsetで初期化してはいけない」という話がこのスレにある

だが実際はそんな特殊な環境はめったに無く、人事だろうと思ってたんだ
957デフォルトの名無しさん:2008/06/30(月) 02:36:29
ところがどっこい、身近な環境でそのような例を作れることに気づいてしまった

以下のコードを実行すると、大抵の環境で2回目のassertに失敗する
手元の x86の VC7.1と gcc 3.4で確認したぜ

#include <assert.h>
#include <string.h>
int main()
{
struct A;
struct { int A::*p; } hoge = {0};
assert(!hoge.p); // こちらはOK
memset(&hoge, 0, sizeof(hoge));
assert(!hoge.p); // This assertion fails
}
958デフォルトの名無しさん:2008/07/05(土) 15:26:03
age
959デフォルトの名無しさん:2008/07/05(土) 20:19:28
メンバへのポインタのNULL表現か
これは興味深い
960デフォルトの名無しさん:2008/07/06(日) 04:59:50
struct A { int n; }; なら&A::nは0になるから、
0をNULLに使えないというわけか。
961デフォルトの名無しさん:2008/07/06(日) 22:11:10
gcc 3.4で実験

#include <stdio.h>
struct A {
char elem1;
char buf1[0x7FFFFFFF];
char buf2[0x7FFFFFFE];
char elem2;
char elem3;
char elem4;
};
union UP { char A::*p; size_t n; };
void test(const UP &x) { printf(" nval=%08x, is_null=%d\n", x.n, (x.p==0)); }

int main()
{
UP hoge;
printf("sizeof UP=%u\n", sizeof(UP));
hoge.p=0; test(hoge);
hoge.p=&A::elem1; test(hoge);
hoge.p=&A::elem2; test(hoge);
hoge.p=&A::elem3; test(hoge);
hoge.p=&A::elem4; test(hoge);
}
962デフォルトの名無しさん:2008/07/06(日) 22:12:08
結果
sizeof UP=4
nval=ffffffff, is_null=1
nval=00000000, is_null=0
nval=fffffffe, is_null=0
nval=ffffffff, is_null=1
nval=00000000, is_null=0
エラーチェック無しの gcc 君でした
963マイク ◆yrBrqfF1Ew :2008/07/19(土) 07:12:13
アセンブリ言語をやるとポインタを理解しやすいって書いてあるのを
昔web検索してたらどこかのサイトで見た。
964デフォルトの名無しさん:2008/07/19(土) 08:16:59
頭で理解しようとするから
プログラムは使用ー>理解が原則
965デフォルトの名無しさん:2008/07/19(土) 08:53:21
日本語でOK
966デフォルトの名無しさん:2008/07/19(土) 09:17:52
ポインタが理解できないのは頭で理解しようとするから。
プログラムは使用することで理解する、体験学習が原則。
967デフォルトの名無しさん:2008/07/19(土) 09:50:52
自然と覚える揉んだと思う
小学校でいうなら台形の公式くらいだろ
968デフォルトの名無しさん:2008/07/19(土) 11:55:04
台形の公式なんて聞いた瞬間に覚える種類のもんで、理解するようなもんじゃないだろ。
969デフォルトの名無しさん:2008/07/19(土) 12:34:04
上下逆さまにしたやつを横にくっつけると平行四辺形になり
その面積は 底辺×高さ=(台形の上底+台形の下底)×高さ だから
その半分で (上底+下底)×高さ÷2 と習うんだよ

>>968は小学校からろくに勉強してない池沼
970デフォルトの名無しさん:2008/07/19(土) 13:08:27
少なくともプログラマには向いてないな。>>968
971デフォルトの名無しさん:2008/07/19(土) 13:22:38
は? 対角線を引いて、上底からの三角形と下底からの三角形の面積の和でいいじゃん。
なんで平行四辺形なんて持ち出す必要あるんだ?
972デフォルトの名無しさん:2008/07/19(土) 13:31:25
補助線引くだけで難易度が上がるからな
973デフォルトの名無しさん:2008/07/19(土) 13:35:32
その三角形の面積は、平行四辺形の÷2じゃね
974デフォルトの名無しさん:2008/07/19(土) 13:37:57
>971
それだと
  (上底×高さ÷2)+(下底×高さ÷2)
という式になるだろ
この式を(変数が入ったまま)まとめるのは面積の計算を習う時点では不可能
975デフォルトの名無しさん:2008/07/19(土) 13:42:26
正しい結果が出るならどっちでもいいと思っている俺こそが真のプログラマ。
976デフォルトの名無しさん:2008/07/19(土) 13:47:49
そういうのの下についた奴は本当に不幸だな
977デフォルトの名無しさん:2008/07/19(土) 13:57:56
>>971>>974
そうやっても面積は求められるねというようなことも
教科書には書いてあった気がする、公式には969で出したけど。
978デフォルトの名無しさん:2008/07/20(日) 03:51:07
>>974
なんでだ?面積習う前に、結合法則も分配法則も習ってないのか?
979デフォルトの名無しさん:2008/07/26(土) 12:05:12
int pupi = 5;
int papu = 10;
int *poin = &pupi;
*poin = &papu;//なんでエラーが出るんだよ!
980デフォルトの名無しさん:2008/07/26(土) 12:22:17
*いらないから。
981デフォルトの名無しさん:2008/07/26(土) 15:12:29
&いらないから。
982デフォルトの名無しさん:2008/07/26(土) 17:59:41
int の *poin というよりは int* の poin だからな。初心者が疑問に思うのもわからんでもない。

いっそ static みたいに記述できれば混乱もないだろうに。
pointer int poin; みたいな。
983デフォルトの名無しさん:2008/07/26(土) 18:02:09
poin = &papu;か*poin = papu;
984デフォルトの名無しさん:2008/07/27(日) 17:28:32
次スレ

ポインタはどうやって学ぶべきか part2
http://pc11.2ch.net/test/read.cgi/tech/1217147291/
985デフォルトの名無しさん:2008/07/27(日) 17:56:07
           ,..-─‐-..、
            /.: : : : : : : .ヽ
          R: : : :. : pq: :i}    
           |:.i} : : : :_{: :.レ′
          ノr┴-<」: :j|
        /:r仁ニ= ノ:.ノ|!           _
          /:/ = /: :/ }!        |〕)  何だって?
       {;ハ__,イ: :f  |       /´
       /     }rヘ ├--r─y/
     /     r'‐-| ├-┴〆    _, 、_  '⌒ ☆
      仁二ニ_‐-イ  | |      ∩`ω´)
      | l i  厂  ̄ニニ¬      ノ  ⊂ノ  <<980-981
     ,ゝ、 \ \   __厂`ヽ    (__ ̄) )
     / /\_i⌒ト、_   ノrr- }     し'し′
   └-' ̄. |  |_二二._」」__ノ
986デフォルトの名無しさん:2008/07/27(日) 17:57:56
ソフトウェア開発技術者試験Part124
http://school7.2ch.net/test/read.cgi/lic/1214315947/

155 名前:名無し検定1級さん 投稿日:2008/06/28(土) 21:16:05
おまえ等は険しい雪山を登る登山家だ。
見えるだろ?
B木やらAVL木、二分木がうっそうと生い茂る、危険な沢付近を通行中だ。
987デフォルトの名無しさん
中国人の平均所得は低いけど、銀座には富裕層の中国人がうろうろしていて
日本の経済に影響を与えているだろ
平均やら統計やらだと実態を返って見失う好例

話が飛んでるけど、そもそも平均だけで判断しようっていうのが間違い。
平均だけ見たらあくまで平均が分かるだけで、富裕層の人数とかなんて判断できない。
平均だけを見て「統計」とかほざくな。分散とか標準偏差を高校の教科書で見てごらん。
ちゃんと統計結果を総合的に分析すれば実態を見失わないから。

煽りじゃなく忠告。
なんかお前って考えが表面的。
公式を覚えても意味がない。
本質を、根幹を見るようにしたほうがいい。