[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 19:54 / Filesize : 171 KB / Number-of Response : 914
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん [2007/10/24(水) 04:07:56 ]
なんと!意外にもスレが無かったので立ててみました

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

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

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

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

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

30 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 16:00:00 ]
>>20
Cでvramをレイプしてました

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

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

33 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 17:53:02 ]


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

35 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:13:39 ]
ポインタはランダムアクセスイテレータ

36 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 22:40:29 ]
>>34
ハンドアセンブルなら完璧。



37 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 22:53:52 ]
ポインタ、面白いと思うんだけどな。

38 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 12:09:52 ]
s03.2log.net/home/programmer/archives/blog38.html

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

40 名前:デフォルトの名無しさん [2007/10/25(木) 13:23:34 ]
ポインタなんか要らないと言う話
homepage3.nifty.com/mogami/diary/d0710.html#242

41 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 17:09:55 ]
ポインタ厨へ。ポインタは糞。イラネ。
pc11.2ch.net/test/read.cgi/prog/1140086684/


42 名前:デフォルトの名無しさん [2007/10/25(木) 18:41:27 ]
C言語のポインタの文法はおかしい
pc8.2ch.net/test/read.cgi/tech/1115419223/


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

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


45 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:22:27 ]
ポインタ役たつけどなぁ

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



47 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:34:23 ]
連結リスト

48 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:36:20 ]
ダブルポインタ

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

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

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

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


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

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

53 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 22:26:42 ]
8086がいい。

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

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

56 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:00:09 ]
ポインタよりもC++の参照がよく理解できない



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

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

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

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

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

61 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:36:04 ]
>>56
要するに、int *p と int &pは無関係
int *const p と int &p
const int *const p と const int &p
が対応してる


62 名前:デフォルトの名無しさん [2007/10/27(土) 00:42:03 ]
アナルアナルうるせーよ

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

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

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

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

66 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:20:28 ]
>>65
大抵shared_ptr使っちゃうからなぁ



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

68 名前:デフォルトの名無しさん [2007/10/28(日) 10:04:33 ]


69 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 11:45:20 ]
アセンブリ言語から始めよう

70 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 11:50:55 ]
俺はこれでそれなりに理解した気分になった
www.gihyo.co.jp/books/syoseki.php/4-7741-1142-2
まだ買えるのかは知らない

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

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

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

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

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

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



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


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

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

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

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

82 名前:デフォルトの名無しさん [2007/10/29(月) 18:48:11 ]
Ruby使え

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

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


85 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:49:55 ]
ポインタの配列?

86 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:53:24 ]
>>84
おまえのこと?



87 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:14:41 ]
ポインタのそのまたポインタのそのまたポインタ・・・・・訳わかめ

88 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:27:45 ]
ポインタって、↓こうあるべきじゃね?

int i = 0;
pointer p = new pointer(i);
pointer p2 = new pointer(p);

p.type → int
*p → 0
p2.type → pointer
*p2 → p
**p2 → 0

89 名前:デフォルトの名無しさん [2007/10/30(火) 16:48:43 ]
プログラマなら、いるいらないではなくて、常識です。

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

91 名前:デフォルトの名無しさん [2007/10/31(水) 06:55:33 ]
www.dotup.org/uploda/www.dotup.org0324.gif

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

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

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

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

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

ポインタだって同じ

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



97 名前:デフォルトの名無しさん [2007/10/31(水) 11:29:07 ]
0から100までの偶数の合計を求めるプログラムを作成せよ.
ただしfor文を使用すること.
また,条件分岐(if文とswitch文)を使ってはならない.
課題3
かけ算の九九を以下の例のように表示するプログラムを作成せよ.
ただし,for文のネストを使用すること.
1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
...
1 x 9 = 9
2 x 1 = 2
2 x 2 = 4
...
9 x 9 = 81
課題4
トランプのカード(ジョーカーを除く)を以下の例のようにすべて表示するプログラムを作成せよ.
ただし,for文のネストとswitch文を使用すること.
スペードの A
スペードの 2
スペードの 3
...
スペードの 10
スペードの J
スペードの Q
スペードの K
ダイヤの A
ダイヤの 2
ダイヤの 3
...
助けてくれ。。。
じゃヴぁで頼む。。。

98 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 11:32:50 ]
>>97
スレチ

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

100 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 11:52:44 ]
そんな風にやるなら、そもそもmalloc必要なくね?

101 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 12:08:50 ]
宣言の場合、全ては void* で、アドレスであると考える

使う場合、通常の変数とずれがあるので混乱するが、以下の関係がある
*pointer = var;
pointer = &var;

*foo.pointer = *foo->pointer = foo.var = foo->var;
foo.pointer = foo->pointer = &foo.var = &foo->var;

どちらの形式をとっても、
アドレスと値のどちらにもアクセスできるようにしてあるという点が重要
(ただし、&var には代入できない・const void*とみなせる)

通常の変数は値を出し入れすることに主眼が置かれていて、
ポインタ変数はアドレスのほうを出し入れすることに主眼が置かれている


102 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 12:09:11 ]
>>99
全てを自分で管理するなら、そもそも高級言語は必要ないんじゃ?

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

104 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 12:24:04 ]
ポンタwwww

105 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 19:02:31 ]
>>85
84が言いたいのは↓こういうことじゃね
#include <stdio.h>
int main()
{
short *p, **pp, *pa[9], (*ap)[9];
pp = &p;
printf("ポインタのポインタ: size:%d",sizeof(pp));
printf("\tstep:%d\n",(void *)(pp+1)-(void *)pp);
printf("ポインタの配列: size:%d",sizeof(pa));
printf("\tstep:%d\n",(void *)(pa+1)-(void *)pa);
printf("配列のポインタ: size:%d",sizeof(ap));
printf("\tstep:%d\n",(void *)(ap+1)-(void *)ap);
getchar();
return 0;
}


106 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 19:20:33 ]
103が言いたいのは↓こういうことじゃね
#include <stdio.h>
int main()
{
short *p, **pp, *pa[9], (*ap)[9];
pp = &p;
printf("ポンタのポンタ: size:%d",sizeof(pp));
printf("\tstep:%d\n",(void *)(pp+1)-(void *)pp);
printf("ポンタの配列: size:%d",sizeof(pa));
printf("\tstep:%d\n",(void *)(pa+1)-(void *)pa);
printf("配列のポンタ: size:%d",sizeof(ap));
printf("\tstep:%d\n",(void *)(ap+1)-(void *)ap);
getchar();
return 0;
}



107 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 19:31:20 ]
ポンタ微笑ます

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


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

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

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

112 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 21:01:22 ]
下手

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

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

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

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

115 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 08:41:06 ]
教えたがりしかいねーなこのスレw

116 名前:デフォルトの名無しさん [2007/11/02(金) 19:13:53 ]
これで文字列が代入されないのは何故ですか???
↓を改善させるためにポインタのポインタを使わなきゃいけない理由は何故ですか?


void myalloc(char *p1, char *p2)
{
p1 = malloc(20);
strcpy(p1, "first string");
p2 = malloc(20);
strcpy(p2, "second string");
}


int main(void)
{
char *p1;
char *p2;

myalloc(p1,p2);
printf("p1=%s p2=%s\n", p1, p2);

return 0;
}




117 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:32:37 ]
>>115
ポインタがよくわかりません。教えてください><

118 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:36:16 ]
>>116

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

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

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

121 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:00:53 ]

int main(void)
{
char *p1

この段階ではp1には不定な値が入っている。例えば0xfefefefeだとしておこう

void myalloc(char *p1, char *p2)
{

これが呼ばれた段階で p1 == 0xfefefefe

p1 = malloc(20);
この段階で p1 には何かしらのアドレスが入る。例えば0x00001000 としよう

myallocを抜ける段階でp1という変数は消えてなくなる。
なぜならp1はローカル変数だからだ

結局のところ、myallocのp1は、mainのp1が保持していた 0xfefefefeという値とコピーしたローカル変数に過ぎない
そのローカル変数にmallocの返り値を保存しても、mainのp1には何の影響もないわけだ

122 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:01:56 ]
>0xfefefefeという値とコピーしたローカル変数に過ぎない

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

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

123 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:07:56 ]
仮に
void myalloc(char p1, char p2)
で考えてみよう。

main(){
char p1='a'
char p2='b';
myalloc(p1,p2)
}

こうした時myalloc(p1,p2) にやってくるのは'a','b'という値。
なのでmyalloc(p1,p2)の中でp1,p2を変更してもmainの中のp1,p2は変化しない。

あとは*をつけるだけ。

void myalloc(char *p1, char *p2)

main(){
char* p1="a";
char* p2="b";
myalloc(p1,p2)
}


124 名前:デフォルトの名無しさん [2007/11/02(金) 20:09:33 ]
あ〜なんとなくわかった気がします
つまり・・・

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

126 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:13:20 ]
>>125
そうです。結構はまるポイントですね。これ。



127 名前:デフォルトの名無しさん [2007/11/02(金) 20:17:40 ]
あれ?いやまた分からなくなってきた
↓改善したプログラムですが・・・*p1と*p2もローカル変数だから消えちゃって・・・

void myalloc(char **p1, char **p2)
{
p1 = malloc(20);
strcpy(*p1, "first string");
p2 = malloc(20);
strcpy(*p2, "second string");
}


int main(void)
{
char *p1;
char *p2;

myalloc(&p1,&p2);
printf("p1=%s p2=%s\n", p1, p2);

return 0;
}


128 名前:デフォルトの名無しさん [2007/11/02(金) 20:20:22 ]
まちがった

↓改善したプログラムです

void myalloc(char **p1, char **p2)
{
*p1 = malloc(20);
strcpy(*p1, "first string");
*p2 = malloc(20);
strcpy(*p2, "second string");
}


int main(void)
{
char *p1;
char *p2;

myalloc(&p1,&p2);
printf("p1=%s p2=%s\n", p1, p2);

return 0;
}







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<171KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef