[表示 : 全て 最新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言語問題の自己参照構造体
など物凄く出来が悪いです。

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

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

191 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:32:29 ]
char Array[32][16];

192 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:34:02 ]
>>191
いやそれ文字列になってないw

193 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:35:08 ]
文字の二次元配列だな

194 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:50:07 ]
std::vector<std::vector<std::string> > Array;

195 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 13:51:26 ]
>>192-193
/(^o^)\

196 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:13:34 ]
std::vector<std::vector<std::string *> *> *Array;

197 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:38:22 ]
std::vector< tr1::shared_ptr< std::vector< tr1::shared_ptr< std::string > > > > ary;

198 名前:デフォルトの名無しさん [2007/11/04(日) 20:31:42 ]
ベクター

199 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 20:32:50 ]
ベクトル



200 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 20:34:06 ]
う゛ぇくとぉ

201 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 20:40:22 ]
typedef char *string;
string Array[32][16];
/* 200 get */

202 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:16:19 ]
え?

203 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:40:49 ]
ウルトラ警備隊に聞いてみろ

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

205 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 01:29:37 ]
>>204
あれはいいものだ・・・

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

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

208 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 14:27:35 ]
滅茶苦茶直観的だけど

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



210 名前:デフォルトの名無しさん [2007/11/05(月) 19:02:30 ]
ポインタなんて、実はだだの正数値が入ってる変数なんです
変数と知れず変数を指し示す物と考えると理解が難しいのかもしれません

int a;
int *p;
p = &a;
*p = 10;
printf("%d",a);
結果:
10

普通はやりませんが以下の様に正数型をポインタとしても使えます

int a;
unsigned int p;
p = (unsigned int)&a;
*(int*)p = 10;
printf("%d",a);

結果:
10

このようにキャストをしっかりしてやれば代用が利いたりします

でも、64ビットOSだとこれは変更が要りますが64ビットOSはポインタのサイズが32ビットが64ビットの正数型になるだけなので64ビット長の正数型を用意するだけで良いだけのことですけどね

211 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:33:55 ]
処理系依存なことを言語仕様に定められてるかのように書くなよ・・・

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

213 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:48:18 ]
>>212
それ自然数

214 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:49:06 ]
じゃなくてあってんのか。
まあいいや。

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

216 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 20:56:27 ]
出来ない奴が役に立たない

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

218 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:24:33 ]
俺は知ってた

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



220 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:11:37 ]
ポインタ値の配列の宣言がわからなくてintの配列で代用した

こんなあたりだろ




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

222 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:16:26 ]
確かにそうだが変数名が気に入らないw

223 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:39:02 ]
>>222

気にしては駄目だw

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

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

でいいんですよね?

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

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

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

227 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:59:50 ]
『昔のPC・OSではな〜メモリが64KBしかなくてな〜』とか言う懐古厨はお断り

228 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 01:06:17 ]
最近の若い子はなんでも参照で済ますから・・・

229 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 01:08:29 ]
>>224
たしか、それでおkなはず



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

結果:
10

231 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 03:39:01 ]
当たり前って言えば当たり前

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

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

結果:

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

234 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 11:42:39 ]
>>230
色々怖いな。

235 名前:>>232 mailto:sage [2007/11/06(火) 13:52:26 ]
>>233
見間違えサーセンw

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

237 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:17:15 ]
>>236
いろいろわかってなさ杉

238 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:29:44 ]
初心者だけど

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

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



240 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:34:21 ]
aに10が入る

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

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

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

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

245 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:55:40 ]
>>243
なるほどね、読み返して見たら納得できた。

246 名前:236 mailto:sage [2007/11/06(火) 16:24:31 ]
どっかで見た気がしたんだが記憶違いだったか
しかし、void*とかmallocとか考えるとありえないなorz
スレ汚しすまんかった

247 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 16:48:26 ]
>>241
それはない

248 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 16:59:09 ]
>>241
そういう場合もある

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



250 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 18:37:14 ]
昔々、ポインタにはfarとnearがあっての…

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

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

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

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

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


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

255 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:13:04 ]
SubList使えよ

256 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:36:26 ]
携帯Javaにはそんな便利なもんねえ

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

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

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


259 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 07:39:19 ]
そんな環境実際にあんの?



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

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

262 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 10:38:38 ]
>>261
つ[規格]

263 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 11:06:58 ]
アセンブラをやれ でFA?

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

265 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 14:27:32 ]
>>261
union {
double d;
int *p;
} hoge;

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

これやってみ


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

267 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:15:55 ]
関数ポインタ

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

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

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





268 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:25:14 ]
関数へのポインタだろ

269 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:25:29 ]
関数へのポインタへのダボーポインタだろ



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

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


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

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



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

void *func(void);


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

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


275 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 23:49:29 ]
// 関数ポンタ配列
#include <stdio.h>
typedef int (*pKANSUU)(int);
int pontax0(int ponta){
return ponta-ponta;
}
int pontax1( int ponta ){
return ponta;
}
int pontax2(int ponta ){
return 2*ponta;
}
int main(){
pKANSUU ponta[3]; //int (*ponta[3])(int);
ponta[0] = &pontax0;
ponta[1] = &pontax1;
ponta[2] = &pontax2;
printf("x0: %d, x1: %d, x2: %d\n", (ponta[0])(100), (ponta[1])(100), ponta[2](100) );
return 0;
}

276 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 23:55:36 ]
なんか変なレスが混ざってるんだが、わざとやってるのか?

277 名前:デフォルトの名無しさん [2007/11/08(木) 00:00:13 ]
なんか間違ってね?

278 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:05:54 ]
>>270の答えは何ポンタ?

279 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:06:44 ]
関数配列ってなに



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

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

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

283 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 01:17:09 ]
余計ややこしくなった気もしますね

284 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 06:10:44 ]
ジャンプテーブル

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

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

287 名前:デフォルトの名無しさん [2007/11/08(木) 07:05:56 ]
://local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B

288 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 07:49:01 ]
>不貞の突起
なにやら面妖な……

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

289 名前:デフォルトの名無しさん [2007/11/08(木) 17:33:36 ]
教えてください。
void swap_ptr(char **a, char **b)
{
char *temp;
temp = *a;
*a = *b;
*b = temp;
}

int main(void)
{
char *str_a = "ABC";
char *str_b = "123";
swap_ptr(&str_a, &str_b);
printf("str_a=%s str_b=%s\n", str_a, str_b);
return 0;
}

↑のは正常に文字列の入れ替えが出来ます。
ならば

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

にしたら先頭の一文字だけ交換されるのか・・・と思ったら、交換されない上Warningまで出ます。
何がおかしいのでしょうか?



290 名前:デフォルトの名無しさん [2007/11/08(木) 17:35:09 ]
さらに

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

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

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







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

前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