ポインタはどうやって学ぶべきかat TECH
ポインタはどうやって学ぶべきか - 暇つぶし2ch1:デフォルトの名無しさん
07/10/24 04:07:56
なんと!意外にもスレが無かったので立ててみました

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

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

本当にポインターは必要なのか!?議論しましょう

2:デフォルトの名無しさん
07/10/24 04:08:11
ポインタ死ねよ。
スレリンク(tech板)


3:デフォルトの名無しさん
07/10/24 04:08:47
ポインタでお勧めな本を教えてください


やっぱり一番有名なのは、ポインタ完全制覇ですか?
URLリンク(www.amazon.co.jp)
%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

こっちの本には自己参照構造体によるリストだとか木構造が無い
URLリンク(www.amazon.co.jp)
%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:デフォルトの名無しさん
07/10/24 04:09:04
URLリンク(kmaebashi.com)

5:デフォルトの名無しさん
07/10/24 04:12:01
ポインタのポインタ
関数のポインタ
文字列のポインタ
配列のポインタ

6:デフォルトの名無しさん
07/10/24 04:12:55
          /⌒\
         / / ̄ ̄ ̄ ̄ ̄ ̄\      / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
         |/             \  <  今、ポインタ殺してきた。リアルで。
         /   ∠,,_ノ ソ _ ,,.. _)   \__________________
        /|  '',,((ノ )   ノ (\)  |
        | |     ̄'      ̄ イ   ハァ ハァ
        \| υ     、_/ロロロ)_ ノ
        /         ̄ ̄  \
        /|    υ          \
        ( .|    /  ノ ̄ ̄ ̄)  ノ  \
       ヽ.|◯  |   ノ ̄ ̄ ̄)  /\ ○\
       /.|  o .|  ノ ̄ ̄ ̄) /  \ o゚ \

7:デフォルトの名無しさん
07/10/24 04:14:15
C言語は卑猥すぎる。
何がって、*がだよ。*ですよ*。もう形からしていやらしい。
しかも名前は逆参照演算子。普通とは逆に突っ込む。
意味はポインタ。挿すものだなんて…製作者は何を考えてるんだか。
*を付けた変数をファック。
とても18未満には教えていいような言語じゃないね!

8:デフォルトの名無しさん
07/10/24 04:15:50
作ってわかるCプログラミング(著:日下部)のポインタでつまづいてオワタ\(^o^)/

9:デフォルトの名無しさん
07/10/24 06:11:15
つかポインタのサンプル何本か読んで理解できなかったら適性がない。
この先無理やり続けてもろくなことにはならないから
素直に公務員を目指したほうがいい。

10:デフォルトの名無しさん
07/10/24 07:18:49
>>6
キショイ消えろ。

11:デフォルトの名無しさん
07/10/24 07:30:45
1:何も付けない
2:*を付けてみる
3:&を付けてみる

全部試して落ちないのが正解

12:デフォルトの名無しさん
07/10/24 07:41:51
どうでもいいけどCのポインタの記法はキショい

13:デフォルトの名無しさん
07/10/24 07:54:11
int *p;
int* p;

どっちの書き方します?

14:デフォルトの名無しさん
07/10/24 07:58:27
後者は素人

15:デフォルトの名無しさん
07/10/24 08:14:55
int i, *ip;
って書き方を考えると前者。

C++だと後者かな。

16:デフォルトの名無しさん
07/10/24 09:08:21
C だと int *p; C++ だと int* p; と書いている。

17:デフォルトの名無しさん
07/10/24 09:09:52
そのネタでしか伸ばせないならもう終わろうぜ

18:デフォルトの名無しさん
07/10/24 10:13:31
じゃあ次はモナドはどうやって学ぶべきかで頼む

19:デフォルトの名無しさん
07/10/24 11:14:13
ポインタ理解できない人は、メモリにデータが配置されるってことを
「紙の上」でのみ理解してるんだろうね。

20:デフォルトの名無しさん
07/10/24 11:21:39
理解できてる人は何で理解してんの?
やっぱイケてるC使いは実際にアセンブリ言語でメインメモリいじくっちゃったりしてたんスかね?

21:デフォルトの名無しさん
07/10/24 11:26:07
メモリ配置がうんたらより
単純に演算子がややこしいだけ

22:デフォルトの名無しさん
07/10/24 11:26:31
アセンブリで書いていたこともあるけど、あんまり関係なくないか。
やっていればそりゃあメモリのイメージを掴むのに有利かもしらんけど。

とにかくなんかメモリの塊があって、そこを指している矢印があって、
その矢印がポインタだというイメージでいいんじゃないの。

23:デフォルトの名無しさん
07/10/24 11:28:33
無能なマの馴れ合いはマ板でやれ

ポインタ厨へ。ポインタは糞。イラネ。
スレリンク(prog板)

24:デフォルトの名無しさん
07/10/24 11:28:48
>>20
いや、ワンボードしかなかった時代に、コンピュータをいじり始めたから、分かるだけなのだが...。

25:デフォルトの名無しさん
07/10/24 11:32:10
間接参照表現にキャストする演算子だと思えばいいんでねえの?

26:デフォルトの名無しさん
07/10/24 12:30:22
URLリンク(japanese.joelonsoftware.com)

どうやら大部分の人々はポインタを理解するための脳の一部分を持たずして生まれてくるようだ。
ポインタの理解はスキルではなく、才能の類である。
ポインタの理解にはインダイレクト且つ多重に関連付けを行う論理的思考が要求され、
どうあがいてもそれが出来ない人だっているのだ。


27:デフォルトの名無しさん
07/10/24 14:42:26
俺なんかポインタのポインタを扱えるようになるのに10年かかった。

28:デフォルトの名無しさん
07/10/24 15:06:14
>>27
例えばstrtol()みたいな関数も使えなかったわけですね?

29:デフォルトの名無しさん
07/10/24 15:56:49
>>28
ポインタのポインタを使った処理を思い通りに(納得行くかたちで)組めるようになるのに10年てこと。

30:デフォルトの名無しさん
07/10/24 16:00:00
>>20
Cでvramをレイプしてました

31:デフォルトの名無しさん
07/10/24 16:39:28
関数の呼び出し方が分かったら、なぜポインタが必要かわかる

32:デフォルトの名無しさん
07/10/24 17:35:48
ポインタへのポインタが分からないと
2次元配列の動的確保さえできないんだよな…

33:デフォルトの名無しさん
07/10/24 17:53:02


34:デフォルトの名無しさん
07/10/24 21:00:11
アセンブラを学べばポインタも身につくってホント/ウソ?

35:デフォルトの名無しさん
07/10/24 21:13:39
ポインタはランダムアクセスイテレータ

36:デフォルトの名無しさん
07/10/24 22:40:29
>>34
ハンドアセンブルなら完璧。

37:デフォルトの名無しさん
07/10/24 22:53:52
ポインタ、面白いと思うんだけどな。

38:デフォルトの名無しさん
07/10/25 12:09:52
URLリンク(s03.2log.net)

39:デフォルトの名無しさん
07/10/25 12:10:49
>>37
その面白さを若い奴らにどう伝えていくのか
技術の継承もおじさん世代の役目

40:デフォルトの名無しさん
07/10/25 13:23:34
ポインタなんか要らないと言う話
URLリンク(homepage3.nifty.com)

41:デフォルトの名無しさん
07/10/25 17:09:55
ポインタ厨へ。ポインタは糞。イラネ。
スレリンク(prog板)


42:デフォルトの名無しさん
07/10/25 18:41:27
C言語のポインタの文法はおかしい
スレリンク(tech板)


43:デフォルトの名無しさん
07/10/25 19:04:09
ポインタを知らないと、参照渡しと値渡しの違いが分からないだろ
逆にその違いが分かればポインタも分かる

44:デフォルトの名無しさん
07/10/25 19:08:18
想像力のない奴め、教えてやるよ。
それは、ポインタという形にしてアドレスを意識しなくてもプログラミングできるようになったから
C以降にプログラマになった奴はアドレスを意識する必要性に迫られなかったからだ。
覚える必要がないから覚えなかった。だから理解できなかった。そういうことだ。


45:デフォルトの名無しさん
07/10/25 19:22:27
ポインタ役たつけどなぁ

46:デフォルトの名無しさん
07/10/25 19:30:01
ポインタを安全にした仕組みでできなくて、ポインタでできる有益なことってなにかある?

47:デフォルトの名無しさん
07/10/25 19:34:23
連結リスト

48:デフォルトの名無しさん
07/10/25 19:36:20
ダブルポインタ

49:デフォルトの名無しさん
07/10/25 20:04:42
>>47
ノードオブジェクトがほかのノードオブジェクトの参照を持つ、ではだめか?

>>48
オブジェクトがほかのオブジェクトをもって、そのオブジェクトがまたほかのオブジェクトを持つ、じゃだめか?

50:デフォルトの名無しさん
07/10/25 20:09:46
ポインヨはランダムアクセスイテレータの実装の一つです

51:デフォルトの名無しさん
07/10/25 21:23:23
C言語をいくらやっても分からず、アセンブラを学んだとき
ドミノが倒れるように全てを理解した
あの感動を体験したいならまずC言語からやるのだ
メモリやアドレスの定義もない、入門書からやるのだ
これは数学と似ている。
集合も論理学も教えない。だからクラスの誰も分からない
大学に入って初めて秘密を知るのだ。


まあ無駄なのでアセンブラからやれ

52:デフォルトの名無しさん
07/10/25 21:56:23
>>51
CASLⅡでもいいですか?試験の為に本買ったんですが、Cの勉強(学校)が忙しくて放置したままです。

53:デフォルトの名無しさん
07/10/25 22:26:42
8086がいい。

54:デフォルトの名無しさん
07/10/26 07:12:07
初めて読む8086とかいうやつ?

55:デフォルトの名無しさん
07/10/26 11:30:54
>>53
まあ使うことのないだろうx86系のアセンブラで勉強するか、組み込みで使う可能性のある、ワンチップ
マイコンのアセンブラで勉強するか、どっちが実用性があるんだろうか?

56:デフォルトの名無しさん
07/10/26 13:00:09
ポインタよりもC++の参照がよく理解できない

57:デフォルトの名無しさん
07/10/26 13:25:33
>>56
俺も。
一回参照設定したら変更できないのが参った。
ポインタの変り種だとおもったんだけど違うらしい。

58:デフォルトの名無しさん
07/10/26 17:16:59
>>55
パソコン買えば漏れなく付いてくるx86系の方が実効性は高い

59:デフォルトの名無しさん
07/10/26 21:42:30
>>56
C++の参照は、constなポインタ。
変数宣言時、関数の引数、コンストラクタの初期化リスト内でしか
値を初期化できないように制限してある。
ポインタには、大きなデータのコピーを避けるための"共有"の意味と
配列等で個々の位置を表すための"イテレータ"としての意味とがあるけれど、
後者は使い方を間違えると危険だから前者しかできなくなっているということ

60:デフォルトの名無しさん
07/10/26 21:57:09
参照は正直、std::stringやstd::listを渡すときくらいしか使わんな
なんとなくポインタだと不自然だから参照で渡してる感じ

>>46
とあるメモリー上のデータの塊を、プログラマの都合で「違う解釈の仕方で読む」ことができるのが魅力
当然スピードを気にしなければJavaとかでもできるが、スピードの劣化が一切無くできるのがポインタの魅力

61:デフォルトの名無しさん
07/10/27 00:36:04
>>56
要するに、int *p と int &pは無関係
int *const p と int &p
const int *const p と const int &p
が対応してる


62:デフォルトの名無しさん
07/10/27 00:42:03
アナルアナルうるせーよ

63:デフォルトの名無しさん
07/10/27 10:36:58
演算子の表記法に問題があるんだよ。
同じ*でも、型宣言と、中身を取り出すときの両方で使うから初心者にはややこしい・・・

64:デフォルトの名無しさん
07/10/27 12:10:18
>>59
へーへー
俺もC++の参照よくわからんかったのでもっぱらポインタで代用してたけど
こういう意味だったのね

65:デフォルトの名無しさん
07/10/27 12:34:46
>>60
> 参照は正直、std::stringやstd::listを渡すときくらいしか使わんな
> なんとなくポインタだと不自然だから参照で渡してる感じ

俺はむしろ逆だな。ポインタとしての機能を必要としない限り参照
(あるいは値)で渡す。安全第一だからね。

66:デフォルトの名無しさん
07/10/27 16:20:28
>>65
大抵shared_ptr使っちゃうからなぁ

67:デフォルトの名無しさん
07/10/27 21:46:05
>>66
boost は俺も結構使うけど、あまり必要無いときは使わない。
参照で OK なのにわざわざ boost 持ち込むとかはせん。

68:デフォルトの名無しさん
07/10/28 10:04:33


69:デフォルトの名無しさん
07/10/28 11:45:20
アセンブリ言語から始めよう

70:デフォルトの名無しさん
07/10/28 11:50:55
俺はこれでそれなりに理解した気分になった
URLリンク(www.gihyo.co.jp)
まだ買えるのかは知らない

71:デフォルトの名無しさん
07/10/28 14:19:45
ポインタは特定の場所をポイント、だから!指差すものだと何度いったら。。。

72:デフォルトの名無しさん
07/10/28 16:10:45
なぜポインタを理解できないのかが理解できないから、教えようがないんだよねえ。

73:デフォルトの名無しさん
07/10/28 16:16:43
POD型の動的な多次元配列をポインタを使って実装するなら問題ないけど
テンプレートメンバ関数ポインタを引数に取る関数のポインタの配列のポインタ
とかなると意味わからなくなるんだけどこれは理解できてないからだな

74:デフォルトの名無しさん
07/10/28 16:53:27
ポインターをうまく言い表す日本語が鍵だな

75:デフォルトの名無しさん
07/10/28 17:43:50
>>61
C++ の参照渡しは、
int &p で宣言した関数に対して
呼び出し側では普通に int を渡すのが混乱した。

76:デフォルトの名無しさん
07/10/28 17:46:13
c++ の場合は定義の際は & つかうくせに実際に呼ぶときは
普通に呼べるのは便利だが、混乱の元でもあるね。

77:デフォルトの名無しさん
07/10/28 17:58:23
つーか。参照渡しを表す & とアドレス演算子を表す & に
同じ記号を使うように決めたデザインがド間抜けに一票。


78:デフォルトの名無しさん
07/10/28 18:02:34
ポインタもポインタで定義の際に*使うくせに
実際に呼ぶとき*をつけると中身が出てくる謎仕様
宣言と間接参照演算子が同じってだけで、結局は慣れなんだけどね。

79:デフォルトの名無しさん
07/10/28 18:28:25
>>78
int *p;
ってのは、「*pがint型」という意味でそのような仕様にしたらしい。

80:デフォルトの名無しさん
07/10/28 18:51:16
呼び出し側のソースを見たとき値渡しなのか参照渡しなのかわからないから参照嫌い

81:デフォルトの名無しさん
07/10/29 01:52:21
単純な8bitCPUとかPICとかのアセンブラを学んで見ると良い。
アセンブラで登場する各種のアドレッシングモードを理解出来れば
ポインタなんてそれほど難しいもんじゃないよ。

82:デフォルトの名無しさん
07/10/29 18:48:11
Ruby使え

83:デフォルトの名無しさん
07/10/29 19:36:22
>>79
おお、なるほど。そう説明されればわかりやすいな

84:デフォルトの名無しさん
07/10/29 23:07:16
ポインタのポインタと
配列のポインタを
混同または理解していない香具師が多い


85:デフォルトの名無しさん
07/10/29 23:49:55
ポインタの配列?

86:デフォルトの名無しさん
07/10/29 23:53:24
>>84
おまえのこと?

87:デフォルトの名無しさん
07/10/30 15:14:41
ポインタのそのまたポインタのそのまたポインタ・・・・・訳わかめ

88:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/30 16:48:43
プログラマなら、いるいらないではなくて、常識です。

90:デフォルトの名無しさん
07/10/30 19:49:04
>>88
そういう実装にすりゃいいじゃない。

91:デフォルトの名無しさん
07/10/31 06:55:33
URLリンク(www.dotup.org)

92:デフォルトの名無しさん
07/10/31 09:29:33
・ポインタとは、「メモリ上のアドレスを指し示す」変数である。
・ポインタのみでは実体が無いため、malloc()でそのアドレスを先頭とした実領域を確保する必要がある。

この2点だけ意識してれば十分使えると思うんだけど。何故理解出来ないのかが理解出来ない。

93:デフォルトの名無しさん
07/10/31 10:35:46
データはふわふわと浮かんでるようなイメージでも持ってるのかも
ある「どこかに」はなく、箱の中をただよっているという

94:デフォルトの名無しさん
07/10/31 10:41:44
そういうのを意識してたら
「関数ポインタを引数にとる関数ポインタの多次元配列のポインタ渡し」とかパッと書けるもんなんでしょうか?
だとしたら俺は理解できてないな…

95:デフォルトの名無しさん
07/10/31 11:07:45
四則演算だったら、どれだけ長くなっても難しいとは思わないだろ
1+5-3+2*6+・・・

ポインタだって同じ

96:デフォルトの名無しさん
07/10/31 11:10:06
そりゃあ規則が明確だからね
でもポインタ演算の規則を明確に理解しようと思ったらタイプ理論とかの知識がいるんでしょ?

97:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/31 11:32:50
>>97
スレチ

99:デフォルトの名無しさん
07/10/31 11:48:16
プログラムが扱えるメモリ空間からスタックと静的領域除いた全てをmallocすればアドレス直指定だけで変数の宣言も定義もいらない幸せプログラミングが

100:デフォルトの名無しさん
07/10/31 11:52:44
そんな風にやるなら、そもそもmalloc必要なくね?

101:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/31 12:09:11
>>99
全てを自分で管理するなら、そもそも高級言語は必要ないんじゃ?

103:デフォルトの名無しさん
07/10/31 12:14:30
int *(*(*ponta[N])(int, int (*)(int)))(int);
やっぱ、ポンタってむずいな、orz

104:デフォルトの名無しさん
07/10/31 12:24:04
ポンタwwww

105:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/31 19:31:20
ポンタ微笑ます

108:デフォルトの名無しさん
07/10/31 19:35:39
>>106 103がいいたいのは>>94でしょ
typedef (*pfpf)(int (*)(int));
pfpf pfpfaa_tmp[9][9];
pfpf*** fuck;
fuck = &pfpfaa_tmp;


109:デフォルトの名無しさん
07/10/31 19:39:24
typedef int(*pfpf)(int (*)(int));だった(’ω´)

110:デフォルトの名無しさん
07/10/31 20:54:21
* をデリヘル演算子って呼ぶのがはやってた

111:デフォルトの名無しさん
07/10/31 20:59:15
エロ写真の乳を如何に鷲掴みしようとしても
それはポインタであり実体はそこにはないのである。

112:デフォルトの名無しさん
07/10/31 21:01:22
下手

113:デフォルトの名無しさん
07/10/31 23:02:27
>>1
これから技術者として生きていきたいと、もし君が思っているとしたら。
「~~だから、これは学ばなくていい。」という考え方は、
ひとまずやめたほうがいい。

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

まずは、とにかくトコトン悩んでやってみることだよ。
自分の方向性を決めるのは、その後でも十分だと思う。

114:デフォルトの名無しさん
07/11/02 08:35:23
JavaやC#などの次世代の言語にもポインタの概念はしっかり受け継がれてるから知っておいて損はないかと

115:デフォルトの名無しさん
07/11/02 08:41:06
教えたがりしかいねーなこのスレw

116:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/02 19:32:37
>>115
ポインタがよくわかりません。教えてください><

118:デフォルトの名無しさん
07/11/02 19:36:16
>>116

myalloc(char *p1, char *p2)のp1,p2とmainのp1,p2が別の人だから。

119:デフォルトの名無しさん
07/11/02 19:42:46
>>118
値渡しではなく、参照渡し(アドレス渡し)にしているのにですか?

120:デフォルトの名無しさん
07/11/02 19:46:42
>>119
どこが?
void myalloc(char *p1, char *p2)
はchar*の中身を渡しているだけで、
char*自身を渡してないよ。

121:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/02 20:01:56
>0xfefefefeという値とコピーしたローカル変数に過ぎない

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

だった。意味が通じなくなりそうだから念のため修正

123:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/02 20:09:33
あ~なんとなくわかった気がします
つまり・・・

125:デフォルトの名無しさん
07/11/02 20:11:15
mainのchar *p1が指すアドレスが入っているだけで、
mainのp1自身のアドレスを渡しているわけではないんですね

126:デフォルトの名無しさん
07/11/02 20:13:20
>>125
そうです。結構はまるポイントですね。これ。

127:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/02 20:21:08
>>128>>116とどう違うのか
**になると一気にわからなくなる

130:デフォルトの名無しさん
07/11/02 20:23:27
>>127
実に惜しい
つーか怖いwww

void myalloc(char **p1, char **p2)の中のp1はmainのp1をポインタに持つポインタなので・・・
mainのp1のポインタに対してmallocするには・・・

ていう。

131:デフォルトの名無しさん
07/11/02 20:25:26
こういうところでポインタ宣言と間接参照演算子が同じってのが邪魔してくるんだよな
あと名前の設定をミスってるのが大きい。
char*のやつは文字列型っぽい名前にしなくちゃいけないし、
引数のほうは文字列型のアドレスっぽい名前にしなくちゃ。

132:デフォルトの名無しさん
07/11/02 20:27:50
ってよく見たらmallocおかしいじゃねえかw

133:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/02 20:29:31
図で描けたら簡単なんだけどな・・・

135:デフォルトの名無しさん
07/11/02 20:30:38
>pp1はp1を値に持っている

『pp1は&p1を値に持っている』じゃなくて>『pp1はp1を値に持っている』ですか?

136:デフォルトの名無しさん
07/11/02 20:40:12
>>135
サーセン『pp1は&p1を値に持っている』です。

137:デフォルトの名無しさん
07/11/02 20:40:23
ソースコードでオナニーできて一人前

138:デフォルトの名無しさん
07/11/02 20:40:49
いや、pp1はp1を値に持っているでいいんだ。

139:デフォルトの名無しさん
07/11/02 20:46:44
&&pp1 &pp1 pp1 *pp1 **pp1 ***pp1 処理の度に全部printfで表示させればいいんだよ


140:デフォルトの名無しさん
07/11/02 20:58:48
ベテランの人たちはダブルポインタを扱うとき
いちいち頭で考えて使っているんですか?

それとも体が勝手に動くものなんですか?

141:デフォルトの名無しさん
07/11/02 21:02:40
別にベテランじゃないけど上にあるやつくらいだったら
まともな命名法と*の読み方しだいで何とかなる範囲じゃね?

142:デフォルトの名無しさん
07/11/02 21:06:31
当然頭は使ってるけど何度も使ってれば考える時間は短くて済むようになる

143:デフォルトの名無しさん
07/11/02 21:18:29
C++ならダブルポインタは使わないで済むけどね

144:デフォルトの名無しさん
07/11/02 21:21:23
あれ、>>128で合ってるだろ?と思ったらまちがったって言うのは
>>127がコピペ失敗って意味じゃなくて>>127がバグだったって意味ね

145:デフォルトの名無しさん
07/11/02 22:00:46
freeはいつ呼べばいい?myfree作るべき?

146:デフォルトの名無しさん
07/11/02 22:21:47
宗教論争になりがちだからお好きなように…かなw

147:デフォルトの名無しさん
07/11/02 22:26:52
スマートポインタ使え

148:デフォルトの名無しさん
07/11/02 22:45:47
ポインタって要するに参照渡しのことですよね?

149:デフォルトの名無しさん
07/11/02 22:52:16
参照渡しっていうとなにかとC++の参照が出てくるから困る

150:デフォルトの名無しさん
07/11/02 22:59:47
>>148
参照はダブルポインタ。

151:デフォルトの名無しさん
07/11/03 04:42:12
「ダブルポインタ」っていうのは素人が使う言葉


152:デフォルトの名無しさん
07/11/03 11:51:23
「ダブルポインタ」「ポインタのポインタ」
なんて呼び方はやめて普通に
「ポインタへのポインタ」
って呼べばいい

という主張をどこかで見たな

153:デフォルトの名無しさん
07/11/03 12:36:52
素人は「ダブルポインタ」なんて知らんだろ

154:デフォルトの名無しさん
07/11/03 12:47:29
参照とダブルポインタは違うよね?

155:デフォルトの名無しさん
07/11/03 14:01:21
問題は「ダブルポインタ」と言ってしまうと
「配列へのポインタ」と「ポインタへのポインタ」の
どっちの話をしているのかが決まらないまま話が進むこと

だから素人同士の会話でしか使われない表現ということ


156:デフォルトの名無しさん
07/11/03 14:01:35
ダブルポインタなんて2chでしか貴下ねーな

157:デフォルトの名無しさん
07/11/03 14:03:22
補足

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

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



158:デフォルトの名無しさん
07/11/03 14:09:53

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

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

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



159:デフォルトの名無しさん
07/11/03 14:13:28
そもそも重複スレだし
スレリンク(tech板:49-番)

160:デフォルトの名無しさん
07/11/03 14:15:27
(T** a)みたいにするんじゃなくて
(T* *a)にしたら少し理解しやすくなったかもしれないこともなかったような気がした

161:デフォルトの名無しさん
07/11/03 14:19:18
左の * と 右の * はどっちが優先度高いんだっけ?


162:デフォルトの名無しさん
07/11/03 14:20:59
char str[256];
char *p;
p = str;

163:デフォルトの名無しさん
07/11/03 14:21:07
漏れがCやり始めた頃はダブルポインタなんか言ってる香具師は一人もいなかったな
だれが流行らせたんだ?メジャーな入門本に書いてあるのか?

164:デフォルトの名無しさん
07/11/03 14:22:54
>>163

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

これをだれかが間違って解釈して
馬鹿の間で蔓延したと思われ


165:デフォルトの名無しさん
07/11/03 14:24:54
それは確かにダブルポインタwwwww

166:デフォルトの名無しさん
07/11/03 14:28:21
>>164
それ見てダブルポインタなんてアホな呼び方してるのは
日本人だけだろうと思って調べてみたが
毛唐の間でも普通に使われてるのな
double *p;
int **p;
両方の意味でw



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

168:デフォルトの名無しさん
07/11/03 14:31:55
>>167

int main(int argc, char **argv)


169:デフォルトの名無しさん
07/11/03 14:32:28
ちなみにmeta-pointerって呼び始めたのは俺。
MITで今じゃ完全に定着しているって後輩が言ってた。

170:デフォルトの名無しさん
07/11/03 14:32:48
>>168
それはポインタの配列


171:デフォルトの名無しさん
07/11/03 14:37:23
配列のポインタとポインタの配列は区別しようぜ

172:デフォルトの名無しさん
07/11/03 14:45:37
馬鹿が馬鹿に説教するスレはここですか?


173:デフォルトの名無しさん
07/11/03 14:48:52
>>171
ポインタの配列とダブルポインタの区別はしなくても平気ですか?


174:デフォルトの名無しさん
07/11/03 14:48:53
馬鹿じゃないよ
C言語は得意だけど日本語が苦手なだけだよ

175:デフォルトの名無しさん
07/11/03 15:16:47
double *pは「double型へのポインタ」だろ。そうとしか読めない。

176:デフォルトの名無しさん
07/11/03 15:18:28
ダブルポインタって言葉をほとんど聞いたことが無い

177:デフォルトの名無しさん
07/11/03 15:27:47
俺はある

178:デフォルトの名無しさん
07/11/03 16:10:38
二重ポインタならよく聞くけど、ダブルポインタは滅多に聞かないな。

179:デフォルトの名無しさん
07/11/03 16:23:17
二重ポインタは初耳
ポインタへのポインタばっかり

180:デフォルトの名無しさん
07/11/03 16:40:33
今の今までインディレクトポインタと呼んでいたぞ。

181:デフォルトの名無しさん
07/11/03 16:48:30
昔、面接で「ダブルポインタはOKですが、トリプルポインタは自信がありません」と言った香具師がいた。
案の定、ポインタを理解していなかった。

182:デフォルトの名無しさん
07/11/03 17:52:53
スレリンク(tech板:49番)

183:デフォルトの名無しさん
07/11/03 17:53:31
スレリンク(tech板:52番)

184:デフォルトの名無しさん
07/11/03 23:55:27
そうだ。ダブルポインタとはdouble*のことに違いない。

185:デフォルトの名無しさん
07/11/04 00:00:19
ポインタへのポインタへのポインタは使ったことがない気がする

186:デフォルトの名無しさん
07/11/04 01:59:00
*** は滅多に使わないけど全く使わないということはない
ただそういうときには typedef するか struct になってることの方が多い


187:デフォルトの名無しさん
07/11/04 06:03:01
>>186
使い道が想像できん。

188:デフォルトの名無しさん
07/11/04 10:44:18
>>187
行列の配列とか?

189:デフォルトの名無しさん
07/11/04 12:25:14
3次元の配列の動的確保

190:デフォルトの名無しさん
07/11/04 13:17:16
文字列の二次元配列を使おうとしたときに
どうすればいいか分からなかった漏れが来ましたよ


191:デフォルトの名無しさん
07/11/04 13:32:29
char Array[32][16];

192:デフォルトの名無しさん
07/11/04 13:34:02
>>191
いやそれ文字列になってないw

193:デフォルトの名無しさん
07/11/04 13:35:08
文字の二次元配列だな

194:デフォルトの名無しさん
07/11/04 13:50:07
std::vector<std::vector<std::string> > Array;

195:デフォルトの名無しさん
07/11/04 13:51:26
>>192-193
/(^o^)\

196:デフォルトの名無しさん
07/11/04 16:13:34
std::vector<std::vector<std::string *> *> *Array;

197:デフォルトの名無しさん
07/11/04 16:38:22
std::vector< tr1::shared_ptr< std::vector< tr1::shared_ptr< std::string > > > > ary;

198:デフォルトの名無しさん
07/11/04 20:31:42
ベクター

199:デフォルトの名無しさん
07/11/04 20:32:50
ベクトル

200:デフォルトの名無しさん
07/11/04 20:34:06
う゛ぇくとぉ

201:デフォルトの名無しさん
07/11/04 20:40:22
typedef char *string;
string Array[32][16];
/* 200 get */

202:デフォルトの名無しさん
07/11/04 23:16:19
え?

203:デフォルトの名無しさん
07/11/05 00:40:49
ウルトラ警備隊に聞いてみろ

204:デフォルトの名無しさん
07/11/05 01:07:41
ポインタを理解できない人は、C言語 ポインタ完全制覇を読みなさい。
それでも、わからなければ・・・・
私は知らん。

205:デフォルトの名無しさん
07/11/05 01:29:37
>>204
あれはいいものだ・・・

206:デフォルトの名無しさん
07/11/05 07:48:59
考え方や概念よりも、文法がややこしいんだと思うよ。
変数に成り代われるのは演算子のおかげであって、ポインタ自体はアドレスを指すことしか出来ないんだから。

207:デフォルトの名無しさん
07/11/05 12:15:17
ああ、ポインタの概念自体をさっぱり理解できない人はまずいない。
演算子の扱いとか、関数の引数や戻り値としての扱いとか、直観に反する振る舞いをするのでつまづく。

208:デフォルトの名無しさん
07/11/05 14:27:35
滅茶苦茶直観的だけど

209:デフォルトの名無しさん
07/11/05 15:33:15
ここに書いてあったので「へー、ダブルポインタって呼ぶんだ、初めて聞いたな」と思ってダブルポインタと早速呼称してたorz

210:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/05 19:33:55
処理系依存なことを言語仕様に定められてるかのように書くなよ・・・

212:デフォルトの名無しさん
07/11/05 19:43:46
>>210
そもそも正数っていうのは0より大きい実数のことであって、
unsigned intっていうのは0以上の整数のことであるわけだが。

213:デフォルトの名無しさん
07/11/05 19:48:18
>>212
それ自然数

214:デフォルトの名無しさん
07/11/05 19:49:06
じゃなくてあってんのか。
まあいいや。

215:デフォルトの名無しさん
07/11/05 20:07:26
というかこんなことが出来たとして何の役に立つの?

216:デフォルトの名無しさん
07/11/05 20:56:27
出来ない奴が役に立たない

217:デフォルトの名無しさん
07/11/05 21:15:37
ポインタをintにキャストする人は役に立つんだね
知らなかったよ

218:デフォルトの名無しさん
07/11/05 21:24:33
俺は知ってた

219:デフォルトの名無しさん
07/11/05 21:55:12
過去に一回だけそんな使い方をしたことあるな・・・
なんでそれをやったかは忘れた

220:デフォルトの名無しさん
07/11/05 22:11:37
ポインタ値の配列の宣言がわからなくてintの配列で代用した

こんなあたりだろ




221:デフォルトの名無しさん
07/11/06 00:14:25
ポインタの配列ってこうでいいんじゃないんですか?
int* pointa[10];

222:デフォルトの名無しさん
07/11/06 00:16:26
確かにそうだが変数名が気に入らないw

223:デフォルトの名無しさん
07/11/06 00:39:02
>>222

気にしては駄目だw

224:デフォルトの名無しさん
07/11/06 00:52:22
ポインタの配列
int* ponta[10];

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

でいいんですよね?

225:デフォルトの名無しさん
07/11/06 00:55:41
int[]型みたいなのが無いから書き方がカオスだな

226:デフォルトの名無しさん
07/11/06 00:58:13
ポインタの文法を学ぶ前になんでポンタが必要かを理解させないから苦労して学ぶ気になれないのでは
なんで?最近の言語はコンパイル時に勝手に最適化してくれるんじゃないの?

WEB系ではいらない?
汎用系では?
制御・ファーム・ハード系では?
ソフト系では?

227:デフォルトの名無しさん
07/11/06 00:59:50
『昔のPC・OSではな~メモリが64KBしかなくてな~』とか言う懐古厨はお断り

228:デフォルトの名無しさん
07/11/06 01:06:17
最近の若い子はなんでも参照で済ますから・・・

229:デフォルトの名無しさん
07/11/06 01:08:29
>>224
たしか、それでおkなはず

230:デフォルトの名無しさん
07/11/06 02:56:11
int a;
double *p;
p = (double *)&a;
*(int*)p = 10;
printf("%d",a);

結果:
10

231:デフォルトの名無しさん
07/11/06 03:39:01
当たり前って言えば当たり前

232:デフォルトの名無しさん
07/11/06 08:32:43
>>230
それは流石に駄目だろう
多分、出来なくはないだろうけど浮動小数点数の演算が適応されないポインタに対してこれはナンセンス過ぎないか?

233:デフォルトの名無しさん
07/11/06 11:10:25
int a;
double p;
p = (double)&a;
*(int*)p = 10;
printf("%d",a);

結果:

>>232
これと勘違いしてない?

234:デフォルトの名無しさん
07/11/06 11:42:39
>>230
色々怖いな。

235:>>232
07/11/06 13:52:26
>>233
見間違えサーセンw

236:デフォルトの名無しさん
07/11/06 14:59:59
sizeof(int*) <= sizeof(double*)な処理系じゃないとダメじゃね?
まあこれを満たさない処理系なんてあるのか知らないけど

237:デフォルトの名無しさん
07/11/06 15:17:15
>>236
いろいろわかってなさ杉

238:デフォルトの名無しさん
07/11/06 15:29:44
初心者だけど

>>233
のコードが実行できると
どっかのメモリに10が代入されるってことなのか?

239:236
07/11/06 15:34:16
>>237
ポインタのサイズは指している型に関わらず同じ、なんてことは無かったような気がするんだけど
間違ってる?

240:デフォルトの名無しさん
07/11/06 15:34:21
aに10が入る

241:デフォルトの名無しさん
07/11/06 15:37:47
>>239
ポインタはint型のサイズと同じって記憶があるけど。

242:デフォルトの名無しさん
07/11/06 15:37:55
>>239
ポインタのサイズが型によって違う処理系教えてくれ

243:デフォルトの名無しさん
07/11/06 15:47:56
>>238
doubleにintポインタのアドレスを入れるけど、
doubleの値をintポインタにキャストしてるから、
結局int aに値を入れてるのと同じ。

244:デフォルトの名無しさん
07/11/06 15:48:44
>>243
語弊があるな、intのアドレスをdoubleの値に入れる。かな

245:デフォルトの名無しさん
07/11/06 15:55:40
>>243
なるほどね、読み返して見たら納得できた。

246:236
07/11/06 16:24:31
どっかで見た気がしたんだが記憶違いだったか
しかし、void*とかmallocとか考えるとありえないなorz
スレ汚しすまんかった

247:デフォルトの名無しさん
07/11/06 16:48:26
>>241
それはない

248:デフォルトの名無しさん
07/11/06 16:59:09
>>241
そういう場合もある

249:デフォルトの名無しさん
07/11/06 18:25:36
現状そういう処理系が実在しないにしても
規格上はint *とdouble *が安全に変換できるとは限らない
void *を介しても同じ事

250:デフォルトの名無しさん
07/11/06 18:37:14
昔々、ポインタにはfarとnearがあっての…

251:デフォルトの名無しさん
07/11/06 19:33:07
ポインタなんて今時覚える必要ないと思う。
C#とかポインタを気にせずプログラミングできる言語が主流になりゃいい。
今後PCはどんどん高性能化していって統合環境が整うんだからポインタみたいな
危険な構造、なくしてけばいいよ。
そういうのはコンパイラに任せとけ。

252:デフォルトの名無しさん
07/11/06 21:20:12
例えば貴方の身の回りの家電や車の制御プログラムにC#を入れるとな?
こういうマイコンは限られたメモリをいかに容量的に効率的に高速に使うかが大事

253:デフォルトの名無しさん
07/11/06 21:24:25
>>252
ただ現実にはそういう方向かもね。携帯とか Java 走ってる。

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

ついでに、あまり複雑なことをしなけりゃポインタも簡単。


254:デフォルトの名無しさん
07/11/06 22:10:34
Javaとかにも、配列の途中からを指す方法があればなあ
配列そのものと、何番目かをあらわすIndexと。二つ渡すのが非常にかっこわるい

255:デフォルトの名無しさん
07/11/06 22:13:04
SubList使えよ

256:デフォルトの名無しさん
07/11/06 22:36:26
携帯Javaにはそんな便利なもんねえ

257:デフォルトの名無しさん
07/11/07 06:26:59
>>251
C#、Javaはむしろポインタだらけじゃないか?

258:デフォルトの名無しさん
07/11/07 06:56:56
>>243
>doubleにintポインタのアドレスを入れるけど、
>doubleの値をintポインタにキャストしてるから、
>結局int aに値を入れてるのと同じ。

double*に入れるときは問題ないけど
doubleに入れるときはアドレス値がdouble値としてふさわしくないときに
正規化されて他の正しい浮動小数点数に変換されるだろうから
int*にキャストしたときには別の場所を指してる可能性があるね


259:デフォルトの名無しさん
07/11/07 07:39:19
そんな環境実際にあんの?

260:デフォルトの名無しさん
07/11/07 08:32:42
>>259
確かにその通り。正規化云々以前にポインタ値をdouble変数に入れられない。

261:デフォルトの名無しさん
07/11/07 08:39:01
どうせ二進表現の数なんだから、ビット幅さえ合えば入れられるんじゃないの?
数値としては別な物になるだろうけど。

262:デフォルトの名無しさん
07/11/07 10:38:38
>>261
つ[規格]

263:デフォルトの名無しさん
07/11/07 11:06:58
アセンブラをやれ でFA?

264:デフォルトの名無しさん
07/11/07 14:24:27
>>261
longに入れたりintに入れたりは幅だけ合ってれば出来るけど
doubleの場合は規格化された値しか入れられないよ

265:デフォルトの名無しさん
07/11/07 14:27:32
>>261
union {
double d;
int *p;
} hoge;

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

これやってみ


266:デフォルトの名無しさん
07/11/07 19:32:13
なんていうか
無理に1000いくまで議論しなくてもいいと思うんだ・・・

267:デフォルトの名無しさん
07/11/07 21:15:55
関数ポインタ

int func(int a) {
 return a*2;
}

main(){
 int (*p_func)(int);
 p_func = func;

 (*p_func)(2); //実行方法
}





268:デフォルトの名無しさん
07/11/07 21:25:14
関数へのポインタだろ

269:デフォルトの名無しさん
07/11/07 21:25:29
関数へのポインタへのダボーポインタだろ

270:デフォルトの名無しさん
07/11/07 22:42:55
これは何ですか?関数配列へのポインタ?関数へのポインタの配列?

void (*p_funcs[])(void) = {funca, funcb};


271:デフォルトの名無しさん
07/11/07 22:43:34
ポインタの配列
int* ponta[10];

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



272:デフォルトの名無しさん
07/11/07 22:45:56
これだと関数の戻り値へのポインタなのか誰か関数とかまとめて

void *func(void);


273:デフォルトの名無しさん
07/11/07 22:51:54
関数って配列にできるんですか

274:デフォルトの名無しさん
07/11/07 22:55:31
関数配列の戻り値へのポンタ
int *ponta[10];


275:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/07 23:55:36
なんか変なレスが混ざってるんだが、わざとやってるのか?

277:デフォルトの名無しさん
07/11/08 00:00:13
なんか間違ってね?

278:デフォルトの名無しさん
07/11/08 00:05:54
>>270の答えは何ポンタ?

279:デフォルトの名無しさん
07/11/08 00:06:44
関数配列ってなに

280:デフォルトの名無しさん
07/11/08 00:14:16
>>279
つ kannsuuhairetsu[] = {kannsuu0, kannsuu1, kannsuu2,......};

281:デフォルトの名無しさん
07/11/08 00:27:05
関数ポインタって代入時の&と実行時の*ってなくても動作変わらないよね?
もともとはどっちが正しいの?

282:デフォルトの名無しさん
07/11/08 01:06:42
元々必要だったらしいが、gccがなんか理論武装して独自拡張として省略しても良くしたら、
世間に受け入れられたなんて話を聞いたことがある。

283:デフォルトの名無しさん
07/11/08 01:17:09
余計ややこしくなった気もしますね

284:デフォルトの名無しさん
07/11/08 06:10:44
ジャンプテーブル

285:デフォルトの名無しさん
07/11/08 06:50:19
関数の戻り値へのポインタ
void *func(void);

286:デフォルトの名無しさん
07/11/08 06:52:01
関数の戻り値の型が不貞の時は
void func(void);
で宣言していいんですか?引数が不貞の突起も?

287:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/08 07:49:01
>不貞の突起
なにやら面妖な……

関数の戻り値型は一致しないといけません。まぁ、呼び出し側で値を使わないなら何でも構いませんが。
引き数に関しては、プロトタイプ宣言するなら一致している必要が出てくるのでなしと宣言したらなしになるので、
宣言したくないならなし(void)書いてはいけません。

289:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/08 17:35:09
さらに

void swap_ptr(char **a, char **b)
{
char *temp;
&temp = a;
a = b;
b = &temp;
}

にしたらコンパイルすらできません。この場合はaとbのスタック変数のメモリアドレスそのものを(物理的に)交換しようとしているからなのでしょうか?

291:デフォルトの名無しさん
07/11/08 17:39:22
あ、>>289はWarningは出ないけどコンパイル後実行させた時に
>『問題が発生したため、a.exe を終了します。 ご不便をおかけして申し訳ありません。』
という致命的なエラーで落ちます。


292:デフォルトの名無しさん
07/11/08 17:41:14
>>289の後者は、
void swap_ptr(char ** a, char ** b) {char temp = ** a; ** a = ** b; ** b = temp;}
でないと辻褄が合わない。
そもそもchar * temp; だけではポインタは初期化されていないので、* temp = ...; とした場合不正アクセスになる。

293:デフォルトの名無しさん
07/11/08 17:41:18
変数に入ってる具体的な数字をprintしてみればすぐわかる

294:デフォルトの名無しさん
07/11/08 17:42:52
更に、>290のように&演算子を使った値は右辺値なので代入ができない。

295:デフォルトの名無しさん
07/11/08 17:54:38
printしたらAが出ました。
printf("%c\n",**a);

296:デフォルトの名無しさん
07/11/08 18:03:22
アホかい。

297:デフォルトの名無しさん
07/11/08 18:10:38
&str_aを引数で受け取った場合、

char **a;

&a: ?
a: ?
*a: a配列全体を指すアドレス
**a: aの実体(1文字)

ローカル変数のスタックはどこにいった

298:デフォルトの名無しさん
07/11/08 18:13:38
&a: 文字列のアドレスのアドレス
a: 文字列のアドレス
*a: 文字列(文字配列へのポインタ)
**a: 先頭文字

299:デフォルトの名無しさん
07/11/08 18:14:52
>>292
その通りにやってもエラで落ちます・・

300:デフォルトの名無しさん
07/11/08 18:16:03
違った、
*a: 文字列(文字へのポインタ)

301:デフォルトの名無しさん
07/11/08 18:19:16
&a: ローカル変数a自身のアドレス
a: aの指すアドレス
*a: aの指すアドレスの中身(文字配列全体)を指すアドレス?
**a: aの指すアドレスの・・・?


302:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/08 18:36:23
>>299
>292を使うには、main()でchar str_a[] = "ABC"などとしないといけない。


304:デフォルトの名無しさん
07/11/08 18:38:19
str_a[0]='1';

305:デフォルトの名無しさん
07/11/08 18:51:37
>>303
 char str_a[] = "ABC"; (引数&str_a)もしくは
 char **str_a = "ABC";(引数str_a)で宣言すると
無事に"文字列"全体が交換されたんですけど、先頭文字だけでは無いんですね。何故か

306:デフォルトの名無しさん
07/11/08 18:53:48
いや、なんでもないです。>>305は無視してください

307:デフォルトの名無しさん
07/11/08 19:56:18
ポインタのポインタのポインタのポインタとか
ヘンタイじみたモノは使うのを辞めましょう

308:デフォルトの名無しさん
07/11/08 20:16:36
文字列リテラルを書き換えてはいけない

309:デフォルトの名無しさん
07/11/08 23:51:48
>>305
どうでも良いけど、警告でねーか?
引数とわたす値の型が違ってるんだし
全体が交換されたからといって
こんな間違ったポインタの使い方
なんの役にもたたねぇぞ

310:デフォルトの名無しさん
07/11/09 00:27:30
void main()
{
  (*************printf)("hello\n");
}

これがコンパイルできるのはなぜですか?
気になって夜もろくに眠れません。
誰か教えて!!

311:デフォルトの名無しさん
07/11/09 00:31:10
寝なくていいよ

312:デフォルトの名無しさん
07/11/09 03:30:41


313:デフォルトの名無しさん
07/11/09 22:13:25
void main()
{
  (*************************************************************************************************************************************************************************printf)("hello\n");
}

これも出来たから大丈夫


314:デフォルトの名無しさん
07/11/09 22:16:57

URLリンク(local.joelonsoftware.com)
あなたが再帰アルゴリズムを数秒で書け、連結リストを操作するポインタを使った関数をホワイトボードに書くのと同じくらい早く実装できる大学3年生なら、私たちのニューヨークでのサマーインターンプログラムをチェックしてほしい! 申し込みの締め切りは2月1日だ。

315:デフォルトの名無しさん
07/11/09 23:25:03
つーかこれ通るんだから。
int main(void) {
1;
return 0;
}

316:デフォルトの名無しさん
07/11/10 00:39:09
main(){
('A')
}


317:デフォルトの名無しさん
07/11/10 01:41:07
懐かしい!!ポインタは面白いね

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

この超ドSなコピーとかやってみ?ほんとハラハラさせてくれるよね

318:デフォルトの名無しさん
07/11/10 01:45:28
s2++,s1++するの忘れた
ついポインタに目がいってしまいました

319:デフォルトの名無しさん
07/11/10 01:52:25
main(){
('A')マンドクセ
}

320:デフォルトの名無しさん
07/11/10 02:02:52
ボインたん (;´Д`)ハァハァ

321:デフォルトの名無しさん
07/11/10 02:21:33
(ポインタをメンバに持つ構造体)をメンバに持つ構造体へのポインタ

あたりの自己参照構造体が難しいのですが・・・どうすりゃいいんだ~~~~


322:デフォルトの名無しさん
07/11/10 02:28:14
struct Node
{
struct Node *pNext;
void *ptr;
};

自己参照構造体ってこんなんだっけ?

323:デフォルトの名無しさん
07/11/10 02:31:10
こんなやつ
自己参照構造体が苦手でよくソフ開受かったな俺

typedef struct _person {
 int number;
 char name[40];
 struct _person *prev;
 struct _person *next;
} person;

main() {
 prson *p;
}



324:デフォルトの名無しさん
07/11/10 02:34:46
メンバで「struct _person」を使う理由はまだ宣言されていないから

「struct _person」を「person」という省略名で宣言したいが、
メンバの定義段階では、「struct _person」は定義済みだが未だ「person」は定義されていないため
「struct _person」というダミーの名前を使わないとコンパイルエラーになるからって奴。

325:デフォルトの名無しさん
07/11/10 02:42:48
typedefとか使わなくていいんじゃないかと思う今日この頃


C言語は今でも
struct _person {
 int number;
 char name[40];
 struct _person *prev;
 struct _person *next;
} ;
main() {
 _person *p;
}
こういう書き方はだめなんだっけ?

326:デフォルトの名無しさん
07/11/10 02:48:13
>>325
だめ
そいつはC++でしかできない

327:デフォルトの名無しさん
07/11/10 02:57:55
>>326
そうなんか㌧
最近「C言語で開発」とか言われても、開発環境がC++だから
どこまでがCの仕様なのかわからなくなることがある

328:デフォルトの名無しさん
07/11/10 02:59:49
C++コンパイラ使ってベターCな開発するのはいいが、
その機能がCのものなのかC++のものなのかも理解して
いないような香具師らもウジャウジャいるから気をつけろ。

329:デフォルトの名無しさん
07/11/10 03:18:38
>>326
え??いいんじゃないの?

330:デフォルトの名無しさん
07/11/10 03:20:31
>>328
俺の事だ/(^o^)\

331:デフォルトの名無しさん
07/11/10 03:20:49
>>326

あ、今試したらだめだった
なんでダメなんだっけ?

332:デフォルトの名無しさん
07/11/10 03:24:53
structの部分も含めて「型」なんだって事じゃないの?

333:デフォルトの名無しさん
07/11/10 03:26:19
つまり、main() {
 struct _person *p;
}
にしたらOKってことか

334:デフォルトの名無しさん
07/11/10 03:59:01
ヌルポインター

335:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/10 04:12:55
char p[] = "ABCD"; と宣言したら正常に動作した(ADCD)のですが、

なんでですか?

337:デフォルトの名無しさん
07/11/10 04:13:26
ポインタは配列で操作出来るのでは

338:デフォルトの名無しさん
07/11/10 04:17:07
ファミコンってC言語でプログラムされてるの?
スレリンク(tech板)


339:デフォルトの名無しさん
07/11/10 04:19:02
PS2の開発環境URLリンク(www.freescale.co.jp)

340:デフォルトの名無しさん
07/11/10 04:55:07
あげ

341:デフォルトの名無しさん
07/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 とか(平気で書ける神経が)理解できねえ(笑)
URLリンク(www.kt.rim.or.jp)
■ げねれーた

342:デフォルトの名無しさん
07/11/10 06:49:28
>>335
"ABCD" は 暗黙の const char * だから。


343:デフォルトの名無しさん
07/11/10 07:33:21
>>342
char p[] = "ABCD";とした時も暗黙のconst char * なのですか?

344:デフォルトの名無しさん
07/11/10 09:11:30
ぬるぽ

345:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/10 10:29:36
>>336
char配列の初期化には、例外的に文字列リテラルが使えるという決まりがあるから。

347:デフォルトの名無しさん
07/11/10 10:36:20
>>345
普通に実行できた

$ ./a
p = ADCD
q = ADCD

348:デフォルトの名無しさん
07/11/10 10:57:43
char *p = "ABCD";
は静的なところにある"ABCD"のアドレスをpに入れてるだけ
って認識であってるよね?

349:デフォルトの名無しさん
07/11/10 11:17:54
cc -S a.c して a.s 読めば一目瞭然。



350:デフォルトの名無しさん
07/11/10 11:28:17
>>349
流石に20代だから
流石にアセンブラなんて知りませんよ。流石に


351:デフォルトの名無しさん
07/11/10 12:50:43
>>350
いや。読むだけならアセンブラは簡単。

ポインタの理解にはアセンブラが、
オイラの持論だ。


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

運転覚えるのにエンジン分解したいひとは、アセンブラからどうぞ。


353:デフォルトの名無しさん
07/11/10 17:44:32
分解したくはないけれど、どんな気筒が幾つ、どんな風に配列されているかは知りたいぞ。

354:デフォルトの名無しさん
07/11/10 20:26:59
float f = 10.0f;
int i = *(int*)&f;
printf("%f %f",i,f);

結果:
10.000 10.000

ちょっと遊んでみるw

355:デフォルトの名無しさん
07/11/10 20:30:30
そのとおりだな。

アセンブラを知らないプログラマーは
自動車運転できるのにボンネットを一度も
開けたことの無い人に相当する。


356:デフォルトの名無しさん
07/11/10 20:38:34
俺アセンブラ知らないけどあんまりポインタで困った覚えがない

ボンネットはウォッシャー液が切れたら空ける

357:デフォルトの名無しさん
07/11/10 20:45:42
学習のとっかかりとしてはいいけど、基本的に
アドレスとポインタとは切り分けて考えた方がいいよ

358:デフォルトの名無しさん
07/11/10 20:47:07
ΩΩ Ω<ナ、ナンダッテー

アドレスとポインタって違いを3行で

359:デフォルトの名無しさん
07/11/10 20:52:18
ポインタには(対象の型)という情報が含まれている。
アドレスと言う概念にはそんなものは全くない。
強いて言うなら、void * のようなもの。

360:デフォルトの名無しさん
07/11/10 20:54:12
ほんとに3行だw
ありがとう

361:デフォルトの名無しさん
07/11/10 21:00:13
そもそも規格には、ポインタの値はアドレスであるなんて一言も書いてない。

ってほんと?

362:デフォルトの名無しさん
07/11/10 21:01:59
普通に考えればそうだろ
変数を間接的に指し示してくれさえすれば用は足りるわけだし

363:デフォルトの名無しさん
07/11/10 21:13:08
>>354
うそだろ?

364:デフォルトの名無しさん
07/11/10 21:19:22
ポインタはアドレスを入れるための変数。
お茶碗とごはんの関係。

365:デフォルトの名無しさん
07/11/10 22:14:51
ポインタはただの変数だ~

366:デフォルトの名無しさん
07/11/10 22:21:37
>>355
そのたとえで行くならば、IC やトランジスタ弄ったこと
ない人も同じだな。


367:デフォルトの名無しさん
07/11/10 23:35:12
物理化学やら量子力学を勉強してない人も(ry

368:デフォルトの名無しさん
07/11/10 23:39:11
一人の人間の一生程度じゃどうしようもない範囲ですな

369:デフォルトの名無しさん
07/11/11 01:31:28
俺は頭がいいからなんとかなるけど
低収入のオマエラじゃ無理だな

370:デフォルトの名無しさん
07/11/11 01:40:23
>>369
はいはい、掲示板では何とでもいえるさw

371:デフォルトの名無しさん
07/11/11 03:08:02
>>341
実際こう書くこと多いけど何か問題でもあんの?

372:デフォルトの名無しさん
07/11/11 03:10:51
読みにくいってだけじゃないの?

373:デフォルトの名無しさん
07/11/11 03:15:32
>>371,372

まぁ論外だ。論外だということを理解できない君が、プログラマでない
ことを願う。

374:デフォルトの名無しさん
07/11/11 03:31:38
残念


375:デフォルトの名無しさん
07/11/11 05:10:31
>>371-372
おいおい・・・

376:デフォルトの名無しさん
07/11/11 08:08:22
で実際なにがいけないの?


377:デフォルトの名無しさん
07/11/11 09:51:13
何故にポインタが存在するのか。これがわかれば楽勝

378:デフォルトの名無しさん
07/11/11 11:17:01
俺は第一印象で、途中にNULLがあったらどうするんだ?って思ったが。

379:デフォルトの名無しさん
07/11/11 12:34:15
コーディングは暗号解読じゃねえんだ

380:デフォルトの名無しさん
07/11/11 12:51:28
いやぁ、コメントと改行とインデントがちゃんとしてれば
結構普通に読めると思うけど


でもこれはポインタの話とは違くねぇ?

381:デフォルトの名無しさん
07/11/11 12:54:51
>>380
ポインタは普通の構造体に比べてコピーのコストかからないんだから
逐一名前を付け替えたほうが可読性あがるしそっちのほうが良かろう

382:デフォルトの名無しさん
07/11/11 13:10:43
可読性はポインタには限らないじゃないってことを言いたかった

383:デフォルトの名無しさん
07/11/11 13:57:36
英検準2級に落ちたああア

384:デフォルトの名無しさん
07/11/11 14:46:49
>>383
ポインタの問題でつまづいたか?

385:デフォルトの名無しさん
07/11/11 15:48:43
中間ポインタを置いたほうが
読みやすいってことなの?


386:デフォルトの名無しさん
07/11/11 17:00:16
まず中間ポインタって何よ

387:デフォルトの名無しさん
07/11/11 17:59:52
まぁ、C言語だと、短縮した記述とか、複雑なポインタの連鎖をつかって、
「俺、おまえらと違って頭いいんだよ」
と分り難いコードを得意げに自慢げに晒すヤツが
けっこう居る

388:デフォルトの名無しさん
07/11/11 18:00:33
うん

389:デフォルトの名無しさん
07/11/11 18:07:30
頭が良いことは良いことだ

390:デフォルトの名無しさん
07/11/11 19:10:38
>>388,389

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

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

結論としては>>341のようなコードを書くヤツは頭が悪い。

391:デフォルトの名無しさん
07/11/11 19:12:10
たいていの商品は分かりやすさこそ売り物の価値なんだよ。
高齢化社会を迎える日本だと特にそうだ。

戦後の日本文学が、難解であれば崇高だと勘違いして衰退してしまった反省を
ソースコードにおいても生かしてほしいもんだ。

392:デフォルトの名無しさん
07/11/11 19:33:55
同意ではあるんですが
読む人のレベルにもよりませんか?

393:デフォルトの名無しさん
07/11/11 19:37:09
>>390
うん

394:デフォルトの名無しさん
07/11/11 19:52:45
>>392
もちろんプログラマとしての常識は、身につけている
という前提は必要。

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

あとは、プログラムが対象としている分野ごとの
知識は前提とするけど。例えば、デコーダのプログラム
のソースコードならば、読み手がそのデコードの
アルゴリズムを知っているという前提をした上で、
プログラムを書くことになる。

395:デフォルトの名無しさん
07/11/11 20:01:26
でも.Net Framework、SQL、XML、WebServices、などなど…。
色々ありすぎて、「言語に関する知識」「アルゴリズムに関する知識」という定義が
やっぱり人それぞれになってしまうと思う。

396:デフォルトの名無しさん
07/11/11 21:04:45
>>395
それはどれも応用プログラミングの専門知識であって常識ではないんじゃないか。
現場の常識という事はあるかもしれないが、それでは一般論とはいえない。

ある範囲で分野を定義した時にその中の最低限の知識というのがあるわけで、
それ以上のテクニックだかノウハウだかを理由も無く濫用するのが良い習慣でないのは
間違いないだろう。

397:デフォルトの名無しさん
07/11/11 21:07:57
つうかそんな基本的なところで俺SUGEEやってないで仕事に集中しろよと

398:デフォルトの名無しさん
07/11/11 23:01:25
べた集中するための遊びだろ。
だいたい1:9ぐらいかな。


399:デフォルトの名無しさん
07/11/12 16:34:54
オ…オ…オレSugeeeee!
…って思うもんさ、プログラマなら…

400:デフォルトの名無しさん
07/11/12 18:32:40
>>341はただのポインタ連結だからいいけどさ、
これがC#のプロパティで同じことやられたりしたら、
もう理解不能だな。

401:デフォルトの名無しさん
07/11/13 17:11:27
char dmoji[36][7][7] = {
{ " ##",
" # #",
" # #",
" #####",
" # #",
"# #"},

{ "##### ",
" # #",
"##### ",
" # #",
" # #",
"######"},

{ " ####",
" ## #",
" # ",
"## ",
" ## #",
" ####"},

。。。略・・・

402:デフォルトの名無しさん
07/11/13 17:13:41
464 名前:仕様書無しさん 投稿日:2007/11/13(火) 16:33:04
SEの兄がいつも独り言で死にたいあー死にたいってよく独り言を言ってます
そんなに仕事は厳しいんですか?


465 名前:仕様書無しさん 投稿日:2007/11/13(火) 16:35:49
動かないものを動きますと言わないといけないからとか?


403:デフォルトの名無しさん
07/11/13 18:16:53
宣言に問題あるよな、
最初からそういうもんだと思ってたからあまり考えなかったけど。
int *p, *q;
じゃなくて
*int p, q;
にすりゃいいんだ。

404:デフォルトの名無しさん
07/11/13 18:18:20
pointer<int> p;
こうだろ

405:デフォルトの名無しさん
07/11/13 18:48:11
>>403
その記法で関数ポインタとポインタを返す関数をどうやって区別する?

406:デフォルトの名無しさん
07/11/13 19:31:17
>>404
実際、C++だとstd::tr1::add_pointer<int>::typeとか
boost::mpl::identity<int*>::typeとか書ける。
::typeとか冗長だけどうまく使えば便利に思うこともある。

407:デフォルトの名無しさん
07/11/13 21:39:21
const int a = 1;
int* p = &a;

ってしたら、*pでaの値を変更できる?
*&a ってした場合は、どう?

408:デフォルトの名無しさん
07/11/13 21:49:06
すいません、上を少し訂正します
const int a = 1;
const int* p = &a;

ってしたら、*pでaの値を変更できる?
*&a ってした場合は、どう?

409:デフォルトの名無しさん
07/11/13 22:10:44
つ const_cast

410:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/14 09:13:50
>>410

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

   タイプ

ド データ



アドレス*タイプでデータを指し示すから、*pで、データをアドレス&タイプに変換するから、
&aなんだな。

414:デフォルトの名無しさん
07/11/14 09:17:24
413が何を言ってるのかわからんのだが

415:デフォルトの名無しさん
07/11/14 09:21:59
>>414

「*」や「&」という変な文字を使う理由について推測しただけ。

416:デフォルトの名無しさん
07/11/14 09:45:47
&は変数のアドレスを得る演算子
*はポインタの先にある実体を得る演算子

p = &a;

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

*p = 5;

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

というのは理解してるのかな?

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

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



環境依存だけど。

418:デフォルトの名無しさん
07/11/14 13:47:37
なぜわざわざ・・・

419:デフォルトの名無しさん
07/11/14 17:34:00
それやるくらいだったら、
アセンブリ言語使ってみろというほうがずっと有意義。

420:デフォルトの名無しさん
07/11/14 17:39:28
よくアセンブリ言語薦めるやついるけど、
JavaとかC#とかの高級言語触らせたほうが、どうしてポインタが欲しくなるのかを理解するのにはいいんじゃないか?

421:デフォルトの名無しさん
07/11/14 18:00:35
>>420
JavaとかC#だって、ポインタはあるのだから、欲しくなんてならない。

422:デフォルトの名無しさん
07/11/14 18:01:06
アセンブラなんてしなくてもC++とXbyakで遊べばいいんだよ

423:デフォルトの名無しさん
07/11/14 18:02:49
ポインタや再帰を駆使したアルゴリズムの本ない?


424:デフォルトの名無しさん
07/11/14 18:03:53
Javaにもポインタってあるんですか?

425:デフォルトの名無しさん
07/11/14 18:06:45
>>421
ちげーよ、安全に使えるようになってるから理解しやすいかと思ったんだよ。

426:デフォルトの名無しさん
07/11/14 18:06:59
ポインタと再帰はあんまり関係なくね?

427:デフォルトの名無しさん
07/11/14 18:07:34
>>424
ヒント:ぬるぽ

428:デフォルトの名無しさん
07/11/14 18:08:29
>>424
ポインタは無いよ

429:デフォルトの名無しさん
07/11/14 18:11:19
>>420
アセンブラは良く知らんが同意

>>421
趣味でちょっとしたTCP/IPプロトコルを実装しているんだが
ポインタがないと俺には無理ってぐらいだ
こんなものをC#とかJavaとか他の言語でどうやって書けと(ry
ポインタとmemcpyを使ってソース書くときれいになって読みやすくなってるぞ

430:デフォルトの名無しさん
07/11/14 18:13:31
C#にポインタはあるよ

431:デフォルトの名無しさん
07/11/14 18:15:32
C脳から抜け出せてないのやら他言語に疎いのやら

432:429
07/11/14 18:15:35
>>430
あれは紛い物

433:デフォルトの名無しさん
07/11/14 18:22:26
どういう点が?

434:デフォルトの名無しさん
07/11/14 18:23:12
ポインタだけに点

435:デフォルトの名無しさん
07/11/14 18:29:18
これはいい脱力感

436:デフォルトの名無しさん
07/11/14 18:37:23
わふ?

437:デフォルトの名無しさん
07/11/14 23:10:45
>>432
結局根拠無し?

438:
07/11/16 00:10:00
アセンブラ役にたたんかもしれんが
理解を深めるには結局は近道だと思われ

439:デフォルトの名無しさん
07/11/16 07:30:47
ポインタの理解には、メモリとアドレスについて知れば十分。
インストラクションコードの知識が必要になるのは、もっとずっと後。

440:デフォルトの名無しさん
07/11/16 08:37:13
絶対アドレッシングと相対アドレッシングまで押さえれば完璧

441:デフォルトの名無しさん
07/11/16 09:11:57
//

442:デフォルトの名無しさん
07/11/16 21:44:40
い・・・いんす・・・とらく・・・?

443:デフォルトの名無しさん
07/11/17 02:40:14
たー・・・のお・・・ね・・・えちゃん・・・?

444:デフォルトの名無しさん
07/11/17 06:48:29
ハンドアセンブルで COM ファイルを書いてみる。

445:デフォルトの名無しさん
07/11/17 07:24:47
ORG 100

446:デフォルトの名無しさん
07/11/17 07:32:12
ハンドアセンブルが許されるのはZ80までだよねー(AA略

447:デフォルトの名無しさん
07/11/18 10:52:54
全てのものはメモリ上においてあって、位置はアドレスで示せて、ポインタはアドレスを入れる変数、
でいいんじゃね?

448:デフォルトの名無しさん
07/11/18 12:01:50
ポインタの「型」を忘れるなと何度言ったr

449:デフォルトの名無しさん
07/11/18 12:56:38


450:デフォルトの名無しさん
07/11/18 14:15:25
エスパーのおれが解説を試みてみる

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

の最後の2行の挙動が>>447には含まれてないってことじゃね?

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

ぜんぜんわかりやすくないな。サーセン。

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

ぜんぜんわかりやすくないな。サーセン。

453:デフォルトの名無しさん
07/11/18 14:40:05
加算減算に触れるのには相対アドレス絶対アドレスみたいなのも理解が必要だと思うけど
こういう仕様が表に出ている事のメリットがいまひとつわからない

454:デフォルトの名無しさん
07/11/18 15:10:32
>>447
厳密に言うとメモリ上にない変数もあるのだ、ふっふっふ。

455:デフォルトの名無しさん
07/11/18 15:25:00
レジスタ上ってこと? 確かに忘れてた。ご指摘感謝。
まぁポインタの話をするときはメモリ上って事でいいのでは?

456:デフォルトの名無しさん
07/11/18 15:26:36
いまレジスタってあるの?

457:デフォルトの名無しさん
07/11/18 16:12:24
あるよ、何言ってるんだ?

458:デフォルトの名無しさん
07/11/18 16:28:51
全然意識したことないや

459:デフォルトの名無しさん
07/11/18 16:34:56
じゃあ
register int i;
&i;
ってやってみるといいよ。コンパイラに怒られるから。

460:デフォルトの名無しさん
07/11/18 16:50:18
C言語に register はあるけど、どう扱うかはコンパイラ任せ
じゃない?実際任せるしか無いと思うけど。多少配慮は
してくれるはずだが、下手するとかえって遅くなる場合もある。

CPU 上の話はまたそれはそれで違うよね。

461:デフォルトの名無しさん
07/11/18 17:48:35
レジスタ増えすぎだし人間が管理するより任せた方がいいわな
高級言語でわざわざ意識する機会なんてまず無いわ

462:デフォルトの名無しさん
07/11/18 17:50:14
registerなんてもう10年位使ってない

463:デフォルトの名無しさん
07/11/18 18:26:58
ま、今時register修飾なんか無視するコンパイラがほとんどだよね。
ただしアドレスだけは取れないようになっている。

464:デフォルトの名無しさん
07/11/18 21:02:19
そういえば俺も 10 年以上前にどの変数を register 宣言すると速くなるか、
とか一所懸命自分のコードで調べてた覚えがあるな。けどもうずっと使って
なくてコンパイラ任せ。

465:デフォルトの名無しさん
07/11/20 16:08:13
registerを使わなきゃならんような場面、今後はもうないだろうね。
少ない資源で必死に高速化してた頃が懐かしす。

466:デフォルトの名無しさん
07/11/20 17:48:31
組み込み系ではまだ、たまに使う場面あるけどね。

467:デフォルトの名無しさん
07/11/21 15:31:11
regster使うくらいだったら、自分がアセンブリ言語で書いたほうがいいと考えてしまう。

468:デフォルトの名無しさん
07/11/21 16:32:17
&使わないループ変数には付けときゃいいんだよ。
レジスタが空いてないなら勝手に使われないだけなんだから。

469:デフォルトの名無しさん
07/11/21 16:41:02
そういうど素人なコードは書きたくないなあ。
組み込み系だったらつけるのはわかるけど、
それ以外だったら間抜け以外の何物でもない。
下手したらオプティマイザーを混乱させてかえって遅くなることもあるし。
つっても今の処理系だったらみんな無視するだろうから大丈夫とは思うけど。

なので場所を弁えずregister修飾入れているやつはど素人。

470:デフォルトの名無しさん
07/11/21 16:44:13
>>468
逆!逆!よっぽどの理由がない限りつけないのが普通だってば

471:デフォルトの名無しさん
07/11/21 18:50:12
アドレスを取られたく無い時ぐらいしか思い付かん

472:デフォルトの名無しさん
07/11/21 19:08:20
アドレスを取られたくない時ってのが思いつかん

473:デフォルトの名無しさん
07/11/21 19:39:28
gnuのソースなんか付けまくりだぜ

474:デフォルトの名無しさん
07/11/21 20:23:13
太古のソースを後生大事に保持してるからねえ

475:デフォルトの名無しさん
07/11/21 22:12:01
今時のコンパイラなら謹んで無視するだろ。

476:デフォルトの名無しさん
07/11/21 22:21:49
C++ならregister変数でもアドレス演算子が使えた気がする。

477:デフォルトの名無しさん
07/11/24 10:45:17
最適化なんてコンパイラにやらせときゃいいのさ。
いろんな環境に移植するソースで、いちいちregister付けたり
外したりなんて馬鹿らしくてできん。

478:デフォルトの名無しさん
07/11/25 13:08:45
Cでヌルポが(void *)0ってマクロ定義される理由が分からん。
C++では、「ヌルポを(void *)0って定義してはダメ」って記述されてる
本があるけど、その理由も分からん。

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

Cでは、ヌルポの型は、(void *)なの?
C++では、ヌルポの型は、なんだ?

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

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

型は・・・どうなんだろう
強いて言えばvoid *型な気がするけど

480:デフォルトの名無しさん
07/11/25 13:50:17
NULLは0じゃない。0がNULLなんだ。
この法則に則って考えれば、NULLはCでもC++でも0と定義されるべきであり、それ自体は8進定数と言うことになる。

481:デフォルトの名無しさん
07/11/25 13:55:36
>>478の論点は「型は、なんだ?」だと思うが・・・

ちなみになんで8進?

482:デフォルトの名無しさん
07/11/25 14:14:33
ポインタくらい簡単なものが一般的に「ポインタが難しい」とされてるおかげで、C始めたばっかの人が「ポインタが理解できません」と言ってくれるので(難しいとされているので躊躇せずに言いやすい?)面接のときのモグリ排除に大いに役に立っている。

483:デフォルトの名無しさん
07/11/25 14:16:21
それを考えて新人に特別な扱いせずに
普通に変わった変数としてポインタ教えてたら
やっぱり2年目になっても分かってなかった

484:デフォルトの名無しさん
07/11/25 14:16:55
0で始まるから8進数。

485:デフォルトの名無しさん
07/11/25 14:17:15
ポインタって精々理系にとっての微分積分程度のレベルでしょ

486:デフォルトの名無しさん
07/11/25 14:21:10
16進は0から始まりませんか?

487:デフォルトの名無しさん
07/11/25 14:22:53
>>485
いや、分数の割り算程度でしょ

488:デフォルトの名無しさん
07/11/25 14:24:09
微積分マスターよりポインタマスターの方が数段楽。覚えなきゃいけない事項の絶対量が少なすぎる。

489:デフォルトの名無しさん
07/11/25 14:27:41
ポインタって何を覚えるんだ・・・

490:デフォルトの名無しさん
07/11/25 14:31:09
ポインタ(の存在意義)がわかりませんって面接で言ったらなにがわからないのか聞いてくるから
とくとくと語ってみたら面接官涙目になってた。

491:デフォルトの名無しさん
07/11/25 14:32:16
面接官って技術者の人やってんのかー
ウチの会社は総務だか人事だかがやってたなぁ・・・

492:デフォルトの名無しさん
07/11/25 14:44:45
ポインタがわからないって、ものごとの裏側(仕組み)が
どうなってるのか少しも考えてこなかった証拠じゃね?
コンピュータの中で関数がどうやって呼び出されてるのとか、
変数はどうやってわたされてるのとか、
時計の針はどうやってまわるのとか、
えんぴつとか棒付きアイスはどうやってつくるのとか
普通は自分なりに考えてみるものじゃん

493:デフォルトの名無しさん
07/11/25 14:46:38
赤ちゃんはどうやっ(ry

494:デフォルトの名無しさん
07/11/25 14:57:32
>>492
そうやって裏側の裏側の裏側の……って調べていくとキリがないので、
あるところで計算を打ち切ってcall-by-needで遅延的な思考をすることだってあろう。
そのためにいろんな学問やら処理系やらは多層構造になってるし、
インターフェースが決まってれば実装が見えなくたってかまわないんでしょうよ。
コンピュータをやるなら最低でもアセンブラとかマシン語が云々、とかいう人はそこが分かってない。

495:デフォルトの名無しさん
07/11/25 15:03:53
このスレポインタスレだからしょうがないかと思っていた

496:デフォルトの名無しさん
07/11/25 15:19:54
アセンブラ出身の俺からみてポインタはなんであんな面倒な仕組みなのか理解できないよ。

497:デフォルトの名無しさん
07/11/25 15:21:36
おっちゃん乙

498:デフォルトの名無しさん
07/11/25 15:26:45
>>494
違うんだ
具体的な仕組みを正確につきとめるというより
少なくとも自分のなかでつじつまが合うように
モノゴトの裏側を想像するってこと
抽象化して考えることが出来る奴は、少なくとも
具体の一例を想像して挙げてみることができると思う

499:デフォルトの名無しさん
07/11/25 15:38:00
合理的に考えられる奴ならポインタのおかしさ、不自然さに気づくだろうよ

500:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/25 16:08:17
>>486
16進定数は0xで始まらないといけないので、数値0をあらわすには0x0とする必要がある。

502:デフォルトの名無しさん
07/11/25 17:58:23
>>499
kwsk

503:デフォルトの名無しさん
07/11/25 17:59:57
kwsk聞いたら宣言の話だった、というのは無しにしてほしい。

504:デフォルトの名無しさん
07/11/25 18:00:50
8進の0って表記では00じゃないの?

505:デフォルトの名無しさん
07/11/25 18:33:06
どっちでも一緒だからどうでもいいよ、ポインタと関係ないし

506:デフォルトの名無しさん
07/11/25 20:31:04
世の中にポインタと関係ないものなんてないよ

507:デフォルトの名無しさん
07/11/25 22:59:05
Javaにはポインタは存在しないのに
なぜ NullPointerException が出てくるんですか?

508:デフォルトの名無しさん
07/11/25 23:03:29
語呂がいいから

509:デフォルトの名無しさん
07/11/25 23:12:29
>>507
ガッ

510:デフォルトの名無しさん
07/11/25 23:17:32
JavaにポインタがないこととJavaVMにポインタがないことは別だから。

511:デフォルトの名無しさん
07/11/26 18:22:20
ポインタがわからないという概念がわからない

512:デフォルトの名無しさん
07/11/26 20:19:17
概念は分かるけど、使い方が難しい、使いどころが分からないってことなんだろう多分

513:デフォルトの名無しさん
07/11/26 23:54:11
同じことをするのに何通りも方法があるのが混乱のもと。

514:デフォルトの名無しさん
07/11/27 00:38:36
だから、バカ用言語のjavaが出来たのだよ

515:デフォルトの名無しさん
07/11/27 02:53:01
同じ著者?のExcelのVBAの本はわかりやすいのに
こっちは結局よくわからんかった。著者はCを知らないっぽ
URLリンク(www.amazon.co.jp)


516:デフォルトの名無しさん
07/11/27 13:53:19
Javaは単に見えなくしてるだけじゃないのか?

517:デフォルトの名無しさん
07/11/27 16:40:33
Javaは全部ポインタなのさ。

518:デフォルトの名無しさん
07/11/27 19:44:39
プリミティブ型はポインタがない。
かつ、オブジェクトでも明示的なアドレス演算ができないという意味では
ポインタとしては不完全。

519:デフォルトの名無しさん
07/11/27 21:33:49
ぷ・・・ぷれみあむがた?

520:デフォルトの名無しさん
07/11/27 21:37:37
アドレス演算なんかあってもしょーがない

521:デフォルトの名無しさん
07/11/28 00:47:47
しょうがないというかJavaにはその概念がないんだからできなくて当然だ。

522:デフォルトの名無しさん
07/11/28 01:33:43
できないからやれないのとできるけどやらないのとの間には越えられない壁がある

523:デフォルトの名無しさん
07/11/28 01:39:01
できないけどやるやつが始末悪い

524:デフォルトの名無しさん
07/11/28 07:01:35
言語仕様上可能だからってやるやつも始末悪い

525:デフォルトの名無しさん
07/11/28 08:10:57
Cでは明示的なアドレス演算がないとプログラムが書けないだけのこと。

526:デフォルトの名無しさん
07/11/29 12:49:27
Cを10年やってきた俺が断言しよう。
ポインタのないC#が理想系にもっとも近い。
C++のように氾濫するライブラリを使いこなすためにキャストの嵐もないし。

527:デフォルトの名無しさん
07/11/29 13:05:36
俺もそう思うー

528:デフォルトの名無しさん
07/11/29 13:10:45
C++を10年やってから言ってください^^

529:デフォルトの名無しさん
07/11/29 13:12:10
aho

530:デフォルトの名無しさん
07/11/29 14:18:08
C++も2~3年はやってるがこんな扱いづらい言語はないよ。
自分で一から作るならいいけど、実際の現場じゃ色んな人が触ったソースも
見なきゃならないわけで、当然のように色んなライブラリが使われてる。
次から次へと覚えることが多すぎてヘボな俺の頭はついてけないぜ。

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

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

C++は使い古されてもうカオス状態。言語としては何でもできる良い言語だけど
俺はもう嫌だ。ボスケテー

531:デフォルトの名無しさん
07/11/29 18:54:21
>>おぞましいほど多様な形態がある。
それはC++のせいではない。
そこの区別がつかないようでは(略

532:デフォルトの名無しさん
07/11/29 19:00:49
CLI(笑)


533:デフォルトの名無しさん
07/11/29 20:26:42
C++は

534:デフォルトの名無しさん
07/11/29 20:38:54
その中でC++の文字列型と言えるのはstd::stringだけじゃねぇ?


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch