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

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

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

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

370 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 01:40:23 ]
>>369
はいはい、掲示板では何とでもいえるさw

371 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 03:08:02 ]
>>341
実際こう書くこと多いけど何か問題でもあんの?

372 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 03:10:51 ]
読みにくいってだけじゃないの?

373 名前:デフォルトの名無しさん [2007/11/11(日) 03:15:32 ]
>>371,372

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

374 名前:デフォルトの名無しさん [2007/11/11(日) 03:31:38 ]
残念


375 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 05:10:31 ]
>>371-372
おいおい・・・

376 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 08:08:22 ]
で実際なにがいけないの?


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



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

379 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 12:34:15 ]
コーディングは暗号解読じゃねえんだ

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


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

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

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

383 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:57:36 ]
英検準2級に落ちたああア

384 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 14:46:49 ]
>>383
ポインタの問題でつまづいたか?

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


386 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 17:00:16 ]
まず中間ポインタって何よ

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



388 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:00:33 ]
うん

389 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:07:30 ]
頭が良いことは良いことだ

390 名前:デフォルトの名無しさん [2007/11/11(日) 19:10:38 ]
>>388,389

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

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

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

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

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

392 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:33:55 ]
同意ではあるんですが
読む人のレベルにもよりませんか?

393 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:37:09 ]
>>390
うん

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

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

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

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

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

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

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



398 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:01:25 ]
べた集中するための遊びだろ。
だいたい1:9ぐらいかな。


399 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 16:34:54 ]
オ…オ…オレSugeeeee!
…って思うもんさ、プログラマなら…

400 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 18:16:53 ]
宣言に問題あるよな、
最初からそういうもんだと思ってたからあまり考えなかったけど。
int *p, *q;
じゃなくて
*int p, q;
にすりゃいいんだ。

404 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 18:18:20 ]
pointer<int> p;
こうだろ

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

406 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 09:13:50 ]
>>410

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

   タイプ

ド データ



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

414 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 09:17:24 ]
413が何を言ってるのかわからんのだが

415 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 09:21:59 ]
>>414

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

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

p = &a;

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

*p = 5;

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

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

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

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



環境依存だけど。



418 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 13:47:37 ]
なぜわざわざ・・・

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

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

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

422 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:01:06 ]
アセンブラなんてしなくてもC++とXbyakで遊べばいいんだよ

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


424 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:03:53 ]
Javaにもポインタってあるんですか?

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

426 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:06:59 ]
ポインタと再帰はあんまり関係なくね?

427 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:07:34 ]
>>424
ヒント:ぬるぽ



428 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:08:29 ]
>>424
ポインタは無いよ

429 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:11:19 ]
>>420
アセンブラは良く知らんが同意

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

430 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:13:31 ]
C#にポインタはあるよ

431 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:15:32 ]
C脳から抜け出せてないのやら他言語に疎いのやら

432 名前:429 mailto:sage [2007/11/14(水) 18:15:35 ]
>>430
あれは紛い物

433 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:22:26 ]
どういう点が?

434 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:23:12 ]
ポインタだけに点

435 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:29:18 ]
これはいい脱力感

436 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:37:23 ]
わふ?

437 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:10:45 ]
>>432
結局根拠無し?



438 名前: mailto:sage [2007/11/16(金) 00:10:00 ]
アセンブラ役にたたんかもしれんが
理解を深めるには結局は近道だと思われ

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

440 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 08:37:13 ]
絶対アドレッシングと相対アドレッシングまで押さえれば完璧

441 名前:デフォルトの名無しさん [2007/11/16(金) 09:11:57 ]
//

442 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:44:40 ]
い・・・いんす・・・とらく・・・?

443 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 02:40:14 ]
たー・・・のお・・・ね・・・えちゃん・・・?

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

445 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 07:24:47 ]
ORG 100

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

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



448 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 12:01:50 ]
ポインタの「型」を忘れるなと何度言ったr

449 名前:デフォルトの名無しさん [2007/11/18(日) 12:56:38 ]


450 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 14:15:25 ]
エスパーのおれが解説を試みてみる

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

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

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

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

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

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

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

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

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

456 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 15:26:36 ]
いまレジスタってあるの?

457 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 16:12:24 ]
あるよ、何言ってるんだ?



458 名前:デフォルトの名無しさん [2007/11/18(日) 16:28:51 ]
全然意識したことないや

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

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

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

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

462 名前:デフォルトの名無しさん [2007/11/18(日) 17:50:14 ]
registerなんてもう10年位使ってない

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

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

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

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

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



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

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

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






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

前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