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

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

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

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

これも出来たから大丈夫


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

local.joelonsoftware.com/mediawiki/index.php/Java%E3%82%B9%E3%82%AF%E3%83%BC%E3%83%AB%E3%81%AE%E5%8D%B1%E9%99%BA
あなたが再帰アルゴリズムを数秒で書け、連結リストを操作するポインタを使った関数をホワイトボードに書くのと同じくらい早く実装できる大学3年生なら、私たちのニューヨークでのサマーインターンプログラムをチェックしてほしい! 申し込みの締め切りは2月1日だ。

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

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


317 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:41:07 ]
懐かしい!!ポインタは面白いね

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

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

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

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

320 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:02:52 ]
ボインたん (;´Д`)ハァハァ

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

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




322 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:28:14 ]
struct Node
{
struct Node *pNext;
void *ptr;
};

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

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

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

main() {
 prson *p;
}



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

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

325 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:42:48 ]
typedefとか使わなくていいんじゃないかと思う今日この頃


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

326 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:48:13 ]
>>325
だめ
そいつはC++でしかできない

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

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

329 名前:デフォルトの名無しさん [2007/11/10(土) 03:18:38 ]
>>326
え??いいんじゃないの?

330 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 03:20:31 ]
>>328
俺の事だ/(^o^)\

331 名前:デフォルトの名無しさん [2007/11/10(土) 03:20:49 ]
>>326

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



332 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 03:24:53 ]
structの部分も含めて「型」なんだって事じゃないの?

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

334 名前:デフォルトの名無しさん [2007/11/10(土) 03:59:01 ]
ヌルポインター

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

なんでですか?

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

338 名前:デフォルトの名無しさん [2007/11/10(土) 04:17:07 ]
ファミコンってC言語でプログラムされてるの?
pc11.2ch.net/test/read.cgi/tech/1183559070/


339 名前:デフォルトの名無しさん [2007/11/10(土) 04:19:02 ]
PS2の開発環境www.freescale.co.jp/codewarrior/products/game/ps2/index.html

340 名前:デフォルトの名無しさん mailto:age [2007/11/10(土) 04:55:07 ]
あげ

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



342 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 06:49:28 ]
>>335
"ABCD" は 暗黙の const char * だから。


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

344 名前:デフォルトの名無しさん [2007/11/10(土) 09:11:30 ]
ぬるぽ

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

347 名前:デフォルトの名無しさん [2007/11/10(土) 10:36:20 ]
>>345
普通に実行できた

$ ./a
p = ADCD
q = ADCD

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

349 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 11:17:54 ]
cc -S a.c して a.s 読めば一目瞭然。



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


351 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 12:50:43 ]
>>350
いや。読むだけならアセンブラは簡単。

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




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

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


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

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

結果:
10.000 10.000

ちょっと遊んでみるw

355 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 20:30:30 ]
そのとおりだな。

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


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

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

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

358 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 20:47:07 ]
ΩΩ Ω<ナ、ナンダッテー

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

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

360 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 20:54:12 ]
ほんとに3行だw
ありがとう

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

ってほんと?



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

363 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 21:13:08 ]
>>354
うそだろ?

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

365 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:14:51 ]
ポインタはただの変数だ〜

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


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

368 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:39:11 ]
一人の人間の一生程度じゃどうしようもない範囲ですな

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なんだな。






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

前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