- 1 名前:デフォルトの名無しさん [2007/10/24(水) 04:07:56 ]
- なんと!意外にもスレが無かったので立ててみました
先日のソフトウェア開発技術者試験午後UのB木のポインタ表現 近年の基本情報技術者試験の午後C言語問題の自己参照構造体 など物凄く出来が悪いです。 ゆとり?文系?自作減少? ブラックボックス化されてメモリ管理やコンピュータの細かい知識が不要となった? 本当にポインターは必要なのか!?議論しましょう
- 116 名前:デフォルトの名無しさん [2007/11/02(金) 19:13:53 ]
- これで文字列が代入されないのは何故ですか???
↓を改善させるためにポインタのポインタを使わなきゃいけない理由は何故ですか? void myalloc(char *p1, char *p2) { p1 = malloc(20); strcpy(p1, "first string"); p2 = malloc(20); strcpy(p2, "second string"); } int main(void) { char *p1; char *p2; myalloc(p1,p2); printf("p1=%s p2=%s\n", p1, p2); return 0; }
- 117 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:32:37 ]
- >>115
ポインタがよくわかりません。教えてください><
- 118 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:36:16 ]
- >>116
myalloc(char *p1, char *p2)のp1,p2とmainのp1,p2が別の人だから。
- 119 名前:デフォルトの名無しさん [2007/11/02(金) 19:42:46 ]
- >>118
値渡しではなく、参照渡し(アドレス渡し)にしているのにですか?
- 120 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:46:42 ]
- >>119
どこが? void myalloc(char *p1, char *p2) はchar*の中身を渡しているだけで、 char*自身を渡してないよ。
- 121 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:00:53 ]
-
int main(void) { char *p1 この段階ではp1には不定な値が入っている。例えば0xfefefefeだとしておこう void myalloc(char *p1, char *p2) { これが呼ばれた段階で p1 == 0xfefefefe p1 = malloc(20); この段階で p1 には何かしらのアドレスが入る。例えば0x00001000 としよう myallocを抜ける段階でp1という変数は消えてなくなる。 なぜならp1はローカル変数だからだ 結局のところ、myallocのp1は、mainのp1が保持していた 0xfefefefeという値とコピーしたローカル変数に過ぎない そのローカル変数にmallocの返り値を保存しても、mainのp1には何の影響もないわけだ
- 122 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:01:56 ]
- >0xfefefefeという値とコピーしたローカル変数に過ぎない
0xfefefefeという値「を」コピーしたローカル変数に過ぎない だった。意味が通じなくなりそうだから念のため修正
- 123 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:07:56 ]
- 仮に
void myalloc(char p1, char p2) で考えてみよう。 main(){ char p1='a' char p2='b'; myalloc(p1,p2) } こうした時myalloc(p1,p2) にやってくるのは'a','b'という値。 なのでmyalloc(p1,p2)の中でp1,p2を変更してもmainの中のp1,p2は変化しない。 あとは*をつけるだけ。 void myalloc(char *p1, char *p2) main(){ char* p1="a"; char* p2="b"; myalloc(p1,p2) }
- 124 名前:デフォルトの名無しさん [2007/11/02(金) 20:09:33 ]
- あ〜なんとなくわかった気がします
つまり・・・
- 125 名前:デフォルトの名無しさん [2007/11/02(金) 20:11:15 ]
- mainのchar *p1が指すアドレスが入っているだけで、
mainのp1自身のアドレスを渡しているわけではないんですね
- 126 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:13:20 ]
- >>125
そうです。結構はまるポイントですね。これ。
- 127 名前:デフォルトの名無しさん [2007/11/02(金) 20:17:40 ]
- あれ?いやまた分からなくなってきた
↓改善したプログラムですが・・・*p1と*p2もローカル変数だから消えちゃって・・・ void myalloc(char **p1, char **p2) { p1 = malloc(20); strcpy(*p1, "first string"); p2 = malloc(20); strcpy(*p2, "second string"); } int main(void) { char *p1; char *p2; myalloc(&p1,&p2); printf("p1=%s p2=%s\n", p1, p2); return 0; }
- 128 名前:デフォルトの名無しさん [2007/11/02(金) 20:20:22 ]
- まちがった
↓改善したプログラムです void myalloc(char **p1, char **p2) { *p1 = malloc(20); strcpy(*p1, "first string"); *p2 = malloc(20); strcpy(*p2, "second string"); } int main(void) { char *p1; char *p2; myalloc(&p1,&p2); printf("p1=%s p2=%s\n", p1, p2); return 0; }
- 129 名前:デフォルトの名無しさん [2007/11/02(金) 20:21:08 ]
- >>128が>>116とどう違うのか
**になると一気にわからなくなる
- 130 名前:デフォルトの名無しさん [2007/11/02(金) 20:23:27 ]
- >>127
実に惜しい つーか怖いwww void myalloc(char **p1, char **p2)の中のp1はmainのp1をポインタに持つポインタなので・・・ mainのp1のポインタに対してmallocするには・・・ ていう。
- 131 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:25:26 ]
- こういうところでポインタ宣言と間接参照演算子が同じってのが邪魔してくるんだよな
あと名前の設定をミスってるのが大きい。 char*のやつは文字列型っぽい名前にしなくちゃいけないし、 引数のほうは文字列型のアドレスっぽい名前にしなくちゃ。
- 132 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:27:50 ]
- ってよく見たらmallocおかしいじゃねえかw
- 133 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:28:39 ]
- >>129
一回名前かえよう void myalloc(char **pp1, char **pp2) { } int main(void) { char *p1; char *p2; } とすると、pp1はp1を値に持っている。なので*pp1=p1 *pp1をいじると当然p1も変わる。
- 134 名前:デフォルトの名無しさん [2007/11/02(金) 20:29:31 ]
- 図で描けたら簡単なんだけどな・・・
- 135 名前:デフォルトの名無しさん [2007/11/02(金) 20:30:38 ]
- >pp1はp1を値に持っている
『pp1は&p1を値に持っている』じゃなくて>『pp1はp1を値に持っている』ですか?
- 136 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:40:12 ]
- >>135
サーセン『pp1は&p1を値に持っている』です。
- 137 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:40:23 ]
- ソースコードでオナニーできて一人前
- 138 名前:デフォルトの名無しさん [2007/11/02(金) 20:40:49 ]
- いや、pp1はp1を値に持っているでいいんだ。
- 139 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:46:44 ]
- &&pp1 &pp1 pp1 *pp1 **pp1 ***pp1 処理の度に全部printfで表示させればいいんだよ
- 140 名前:デフォルトの名無しさん [2007/11/02(金) 20:58:48 ]
- ベテランの人たちはダブルポインタを扱うとき
いちいち頭で考えて使っているんですか? それとも体が勝手に動くものなんですか?
- 141 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:02:40 ]
- 別にベテランじゃないけど上にあるやつくらいだったら
まともな命名法と*の読み方しだいで何とかなる範囲じゃね?
- 142 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:06:31 ]
- 当然頭は使ってるけど何度も使ってれば考える時間は短くて済むようになる
- 143 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:18:29 ]
- C++ならダブルポインタは使わないで済むけどね
- 144 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:21:23 ]
- あれ、>>128で合ってるだろ?と思ったらまちがったって言うのは
>>127がコピペ失敗って意味じゃなくて>>127がバグだったって意味ね
- 145 名前:デフォルトの名無しさん [2007/11/02(金) 22:00:46 ]
- freeはいつ呼べばいい?myfree作るべき?
- 146 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:21:47 ]
- 宗教論争になりがちだからお好きなように…かなw
- 147 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:26:52 ]
- スマートポインタ使え
- 148 名前:デフォルトの名無しさん [2007/11/02(金) 22:45:47 ]
- ポインタって要するに参照渡しのことですよね?
- 149 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:52:16 ]
- 参照渡しっていうとなにかとC++の参照が出てくるから困る
- 150 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:59:47 ]
- >>148
参照はダブルポインタ。
- 151 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:42:12 ]
- 「ダブルポインタ」っていうのは素人が使う言葉
- 152 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 11:51:23 ]
- 「ダブルポインタ」「ポインタのポインタ」
なんて呼び方はやめて普通に 「ポインタへのポインタ」 って呼べばいい という主張をどこかで見たな
- 153 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 12:36:52 ]
- 素人は「ダブルポインタ」なんて知らんだろ
- 154 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 12:47:29 ]
- 参照とダブルポインタは違うよね?
- 155 名前:デフォルトの名無しさん [2007/11/03(土) 14:01:21 ]
- 問題は「ダブルポインタ」と言ってしまうと
「配列へのポインタ」と「ポインタへのポインタ」の どっちの話をしているのかが決まらないまま話が進むこと ↓ だから素人同士の会話でしか使われない表現ということ
- 156 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:01:35 ]
- ダブルポインタなんて2chでしか貴下ねーな
- 157 名前:デフォルトの名無しさん [2007/11/03(土) 14:03:22 ]
- 補足
× 問題は「ダブルポインタ」と言ってしまうと ○ 問題は「char **p;」の表記だけを見て「ダブルポインタ」と言ってしまうと
- 158 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:09:53 ]
-
ちょっと暇つぶししてみた ダブルポインタ に一致する日本語のページ 約 3,040 件 ポインタのポインタ に一致する日本語のページ 約 9,800 件 配列のポインタ に一致する日本語のページ 約 672 件 ポインタへのポインタ に一致する日本語のページ 約 616 件 配列へのポインタ に一致する日本語のページ 約 14,800 件 最近はブログのせいでごみばっかり引っかかるようになってしまった と言っても以前はマニュアルのコピーばっかり引っかかってた訳だが
- 159 名前:デフォルトの名無しさん [2007/11/03(土) 14:13:28 ]
- そもそも重複スレだし
pc11.2ch.net/test/read.cgi/tech/1171172537/49-
- 160 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:15:27 ]
- (T** a)みたいにするんじゃなくて
(T* *a)にしたら少し理解しやすくなったかもしれないこともなかったような気がした
- 161 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:19:18 ]
- 左の * と 右の * はどっちが優先度高いんだっけ?
- 162 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:20:59 ]
- char str[256];
char *p; p = str;
- 163 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:21:07 ]
- 漏れがCやり始めた頃はダブルポインタなんか言ってる香具師は一人もいなかったな
だれが流行らせたんだ?メジャーな入門本に書いてあるのか?
- 164 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:22:54 ]
- >>163
int *p; イントポインタ double *q; ダブルポインタ これをだれかが間違って解釈して 馬鹿の間で蔓延したと思われ
- 165 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:24:54 ]
- それは確かにダブルポインタwwwww
- 166 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:28:21 ]
- >>164
それ見てダブルポインタなんてアホな呼び方してるのは 日本人だけだろうと思って調べてみたが 毛唐の間でも普通に使われてるのな double *p; int **p; 両方の意味でw
- 167 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:30:24 ]
- >>157
char **p; と書いて配列へのポインタと解釈することなんてありえるか? 配列へのポインタといったら char (*p)[N]; じゃないのか?
- 168 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:31:55 ]
- >>167
int main(int argc, char **argv)
- 169 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:32:28 ]
- ちなみにmeta-pointerって呼び始めたのは俺。
MITで今じゃ完全に定着しているって後輩が言ってた。
- 170 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:32:48 ]
- >>168
それはポインタの配列
- 171 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:37:23 ]
- 配列のポインタとポインタの配列は区別しようぜ
- 172 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:45:37 ]
- 馬鹿が馬鹿に説教するスレはここですか?
- 173 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:48:52 ]
- >>171
ポインタの配列とダブルポインタの区別はしなくても平気ですか?
- 174 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:48:53 ]
- 馬鹿じゃないよ
C言語は得意だけど日本語が苦手なだけだよ
- 175 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 15:16:47 ]
- double *pは「double型へのポインタ」だろ。そうとしか読めない。
- 176 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 15:18:28 ]
- ダブルポインタって言葉をほとんど聞いたことが無い
- 177 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 15:27:47 ]
- 俺はある
- 178 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:10:38 ]
- 二重ポインタならよく聞くけど、ダブルポインタは滅多に聞かないな。
- 179 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:23:17 ]
- 二重ポインタは初耳
ポインタへのポインタばっかり
- 180 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:40:33 ]
- 今の今までインディレクトポインタと呼んでいたぞ。
- 181 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:48:30 ]
- 昔、面接で「ダブルポインタはOKですが、トリプルポインタは自信がありません」と言った香具師がいた。
案の定、ポインタを理解していなかった。
- 182 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:52:53 ]
- pc11.2ch.net/test/read.cgi/tech/1171172537/49
- 183 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:53:31 ]
- pc11.2ch.net/test/read.cgi/tech/1171172537/52
- 184 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:55:27 ]
- そうだ。ダブルポインタとはdouble*のことに違いない。
- 185 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:00:19 ]
- ポインタへのポインタへのポインタは使ったことがない気がする
- 186 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 01:59:00 ]
- *** は滅多に使わないけど全く使わないということはない
ただそういうときには typedef するか struct になってることの方が多い
- 187 名前:デフォルトの名無しさん [2007/11/04(日) 06:03:01 ]
- >>186
使い道が想像できん。
- 188 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 10:44:18 ]
- >>187
行列の配列とか?
- 189 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:25:14 ]
- 3次元の配列の動的確保
- 190 名前:デフォルトの名無しさん [2007/11/04(日) 13:17:16 ]
- 文字列の二次元配列を使おうとしたときに
どうすればいいか分からなかった漏れが来ましたよ
- 191 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:32:29 ]
- char Array[32][16];
- 192 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:34:02 ]
- >>191
いやそれ文字列になってないw
- 193 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:35:08 ]
- 文字の二次元配列だな
- 194 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:50:07 ]
- std::vector<std::vector<std::string> > Array;
- 195 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:51:26 ]
- >>192-193
/(^o^)\
- 196 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:13:34 ]
- std::vector<std::vector<std::string *> *> *Array;
- 197 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:38:22 ]
- std::vector< tr1::shared_ptr< std::vector< tr1::shared_ptr< std::string > > > > ary;
- 198 名前:デフォルトの名無しさん [2007/11/04(日) 20:31:42 ]
- ベクター
- 199 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 20:32:50 ]
- ベクトル
- 200 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 20:34:06 ]
- う゛ぇくとぉ
- 201 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 20:40:22 ]
- typedef char *string;
string Array[32][16]; /* 200 get */
- 202 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:16:19 ]
- え?
- 203 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:40:49 ]
- ウルトラ警備隊に聞いてみろ
- 204 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 01:07:41 ]
- ポインタを理解できない人は、C言語 ポインタ完全制覇を読みなさい。
それでも、わからなければ・・・・ 私は知らん。
- 205 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 01:29:37 ]
- >>204
あれはいいものだ・・・
- 206 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 07:48:59 ]
- 考え方や概念よりも、文法がややこしいんだと思うよ。
変数に成り代われるのは演算子のおかげであって、ポインタ自体はアドレスを指すことしか出来ないんだから。
- 207 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 12:15:17 ]
- ああ、ポインタの概念自体をさっぱり理解できない人はまずいない。
演算子の扱いとか、関数の引数や戻り値としての扱いとか、直観に反する振る舞いをするのでつまづく。
- 208 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 14:27:35 ]
- 滅茶苦茶直観的だけど
- 209 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 15:33:15 ]
- ここに書いてあったので「へー、ダブルポインタって呼ぶんだ、初めて聞いたな」と思ってダブルポインタと早速呼称してたorz
- 210 名前:デフォルトの名無しさん [2007/11/05(月) 19:02:30 ]
- ポインタなんて、実はだだの正数値が入ってる変数なんです
変数と知れず変数を指し示す物と考えると理解が難しいのかもしれません int a; int *p; p = &a; *p = 10; printf("%d",a); 結果: 10 普通はやりませんが以下の様に正数型をポインタとしても使えます int a; unsigned int p; p = (unsigned int)&a; *(int*)p = 10; printf("%d",a); 結果: 10 このようにキャストをしっかりしてやれば代用が利いたりします でも、64ビットOSだとこれは変更が要りますが64ビットOSはポインタのサイズが32ビットが64ビットの正数型になるだけなので64ビット長の正数型を用意するだけで良いだけのことですけどね
- 211 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:33:55 ]
- 処理系依存なことを言語仕様に定められてるかのように書くなよ・・・
- 212 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:43:46 ]
- >>210
そもそも正数っていうのは0より大きい実数のことであって、 unsigned intっていうのは0以上の整数のことであるわけだが。
- 213 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:48:18 ]
- >>212
それ自然数
- 214 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:49:06 ]
- じゃなくてあってんのか。
まあいいや。
- 215 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 20:07:26 ]
- というかこんなことが出来たとして何の役に立つの?
- 216 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 20:56:27 ]
- 出来ない奴が役に立たない
|

|