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


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

なぜポインタで引っかかる人が多いのか



1 名前:デフォルトの名無しさん [2010/06/30(水) 10:22:47 ]
なぜポインタで引っかかる人が多いのか

引っかかる人は何に困惑しているのか


511 名前:499 mailto:sage [2010/08/29(日) 18:34:27 ]
「参照を理解してない人」に教えてもらってどうすんだ?あ?

無礼な言葉を吐くだけ吐いて、出来ないとなったら教えてください、かよ。おめでたいガキだな。

512 名前: ◆QZaw55cn4c mailto:sage [2010/08/29(日) 18:41:58 ]
>>511
コードを示してください。
私はすでにポインタのポインタを使ったもの、参照をつかったもの、ポインタのポインタを使っていないものの3種を示しています。
時間はたっぷりありますから、アイディアだけでも示してください。

話はそれから。

513 名前:499 mailto:sage [2010/08/29(日) 18:43:48 ]
バカバカしい。
無礼者に使う時間などないよ。
おまえよりもうちょっとマシな誰かが、気が向いたらコード書いてくれるかもしれないから、それまで待ってれば?

514 名前: ◆QZaw55cn4c mailto:sage [2010/08/29(日) 18:47:43 ]
>>513
よく検討もせずに
>それはロジックが悪い。
というほうがよっぽど無礼ですね。こちらは動くコードを書いた上で意見を述べているのですけれども。

コードを示してください。
話はそれから。

515 名前:499 mailto:sage [2010/08/29(日) 18:50:23 ]
そこのロジックの悪さはきちんと検討して発言してるよ。
代替コードも書いている。
おまえにタダで見せる気にならないだけだ。
誰か奇特な人が見せてくれるまで口あけて待っとけ。

516 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 20:34:55 ]
>>515
何か既視感があるな・・・

517 名前: ◆QZaw55cn4c mailto:sage [2010/08/29(日) 20:34:56 ]
>>515
口だけなら「コードを書いている」といくらでもいえます。

それに「見せるきにならない」といいますが、
仮に見せていただければ、私はただただ低頭して「私が馬鹿でした」と発言して消えるでしょう。
それはあなたにとっては、大満足なのではないですか

動くコードを見せて実証することで、私の今までの発言を全否定できるにもかかわらず、それをせずにうそぶくのみ。
これでは、実証するアイディアなりコードなりがないと推測せざるをえません。推測ですけれどもね。

コードを示してください。
話はそれから。

518 名前:499 mailto:sage [2010/08/29(日) 20:38:25 ]
>>517
おまえが馬鹿(というよりは、低レベル)なことは、俺にとってははっきりしてるからな。
別にこんな便所のラクガキの場所で示す必要も無い。
逆に、示してやればおまえのレベルを引き上げてしまう。バカバカしい。
ど素人はど素人のまま、学生の宿題でもやってるのがお似合いだよ。

だいたい、教えて欲しいなら、最初の暴言を謝るのが順序だろう。それもせずにただ出せなんて図々しい。

519 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 20:41:44 ]
ポインタのポインタなんて、Win32のCOMみたいな使い方をする程度かな

ふつーに
struct data *alloc_root(void);
int add_data(struct data *root, char *name, char *tel);
とか作る



520 名前: ◆QZaw55cn4c mailto:sage [2010/08/29(日) 21:22:48 ]
>>518
ひとつ可能性があるとすれば、非再帰的に記述することですかね。

線形リストならば、それは可能ですが、2分木だと結構むずかしくなります。たぶん各ノードにワークエリアを設けて
戻るノードを記憶しなければならないでしょうね。
昔書いた非再帰的なコードをあげておきます。ポインタのポインタは使っていますが。
codepad.org/n3raxalm

私は再帰的なアルゴリズムのみしか念頭にありませんでした。
もし非再帰的に記述することを示唆しておれば、大変失礼いたしまた。

521 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 21:27:33 ]
binary treeで戻る?

522 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 21:31:53 ]
>>521
ええ、binary tree でノードの追加なり総なめを行うのなら、親ノードの位置を逐一記録しておかなければならないでしょうね。
ノードを追加したら、追加されて新しく親ノードになったところをなんらかの形で覚えておかないといけないでしょう。
もしかすると、ノードごとにワークを持つ必要はないかもしれませんが。(>>520 はノードごとにワークをもっていました。)

523 名前:デフォルトの名無しさん mailto:sage [2010/09/01(水) 22:08:27 ]
親ノードとかいらねーよアホ
バイナリツリーでそんな実装するわけねーだろ

524 名前:デフォルトの名無しさん mailto:sage [2010/09/01(水) 23:05:14 ]
たしかに非再帰に書くのなら、いらないみたいですね。
hibari.2ch.net/test/read.cgi/tech/1280653311/735

525 名前:デフォルトの名無しさん mailto:sage [2010/09/04(土) 03:15:33 ]
char *name[]ってどういう意味なんでしょうか?

526 名前:デフォルトの名無しさん mailto:sage [2010/09/04(土) 07:12:23 ]
char **name;

527 名前:デフォルトの名無しさん mailto:sage [2010/09/04(土) 10:47:37 ]
>>526
ありがとう!

528 名前:デフォルトの名無しさん mailto:sage [2010/09/04(土) 15:28:58 ]
えっ

529 名前:デフォルトの名無しさん mailto:sage [2010/09/10(金) 19:18:42 ]
アセンブラでメモリの番地は理解していても
C言語での書き方で悩む事もあるんだよ

>>55みたいな



530 名前:デフォルトの名無しさん mailto:sage [2010/09/10(金) 19:19:32 ]
constの位置とかもな

531 名前:デフォルトの名無しさん mailto:sage [2010/09/10(金) 19:53:48 ]
面倒なので括弧を付ける

532 名前:デフォルトの名無しさん mailto:sage [2010/09/10(金) 23:54:01 ]
>>530
const は一番近い場所にある token が変更不可能になる
っていう理解で桶?

533 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 00:09:14 ]
int const *
近いってどっちだよ、ってなるぞ

534 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 17:57:59 ]
暗記したほうがマシ、というか十分。
理屈を抜きにするから応用利かないけど。

この二つ暗記な。

int *p[] ポインタの配列
int *const p コンストポインタ

だからこそ、
配列のポインタが (*p)[] だと想像できるし、
コンストintへのポインタが int const *だと分かる。

535 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 18:44:36 ]
そんなにむずかしくないだろ
constが後置修飾になってるほうがポインタそのものをconstにしてるだけ
int const もconst int も int を定数にしてるだけなんだし

536 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 20:25:13 ]
いや
いまは
int const * p;

int * const p;
の違いの話をしているんじゃまいか

537 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 20:41:58 ]
イメージ的には、
ポインタの配列は(*p)[] これだし、
constポインタはconst (int *)pこう書きたい。
イメージどおりには行かんね。

538 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 20:52:42 ]
>ポインタの配列は(*p)[] これだし、

hds

539 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 21:44:43 ]
const int *p



540 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 21:54:39 ]
const int *p;
int const *p;
int * const p;

541 名前:デフォルトの名無しさん mailto:sage [2010/09/11(土) 22:22:42 ]
de?

542 名前:デフォルトの名無しさん mailto:sage [2010/09/12(日) 16:15:02 ]
掛け算以外のアスタリスクがあまり出てこないプログラムを心がけてますよ

543 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 18:36:27 ]
>>542
それは C の最強の武器を放棄したに等しい。

544 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 19:10:55 ]
>>540
kwsk

545 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:12:37 ]
const int *p => const int の ポインタ
int const *p => const int の ポインタ
int * const p => int の const ポインタ

546 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:19:34 ]
1行目と2行目の違いが判らんのだが

547 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:24:15 ]
違いはない

548 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:29:20 ]
えっ

549 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:36:05 ]
int main() {
int i = 100, j = 200;
const int *a, *b; // const int
int const *c, *d; // const int
int *const e = &i, *const f = &i; // intへのconstポインタ
int const *const g = &i, *const h = &i; // const intへのconstポインタ

*a = j; // error: assignment of read-only location
*b = j; // error: assignment of read-only location
*c = j; // error: assignment of read-only location
*d = j; // error: assignment of read-only location

e = &j; // error: assignment of read-only variable `e'
f = &j; // error: assignment of read-only variable `f'

*g = j; // error: assignment of read-only location
*h = j; // error: assignment of read-only location
g = &j; // error: assignment of read-only variable `g'
h = &j; // error: assignment of read-only variable `h'

return 0;
}




550 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:38:02 ]
ちょい修正:

const int *a, *b; // const intへのポインタ
int const *c, *d; // const intへのポインタ

551 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 20:51:05 ]
えっえっ

552 名前:デフォルトの名無しさん mailto:sage [2010/09/14(火) 08:42:30 ]
* の左側に const があるか右側にあるかだけですべてが決まるんだよ
* が複数ある場合も何番目の * と * の間に const があるかで意味が決まる

553 名前:デフォルトの名無しさん mailto:sage [2010/09/14(火) 17:48:16 ]
難しいのー

554 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 00:05:24 ]
far * near * とかに比べると、ああらくちんだ〜。

555 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 00:11:29 ]
>>522
巡回するなら普通はスタック使うだろ?
ってマジレスしたらいかんかったのだろうか

>>523
仕様によってはあり得る

556 名前:522 mailto:sage [2010/09/15(水) 00:28:58 ]
>>555
この問題、宿題スレの方で実際にコードを書いていただき、戻る位置をおぼえない方法を示していただきました。
すぱっと非再帰に書き下すきれいなコードでした。>>524
でも、二分木は再帰で書きたいもの、とちょっと負け惜しみ。

557 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 00:46:28 ]
スタティックな変数を使えば再帰でも書ける
最適化を考えると大概再帰よりループ展開の方が速い
どっちでも書けるようになったほうがいいぞ

558 名前:522 mailto:sage [2010/09/15(水) 00:50:29 ]
>>557
それもそうですね。精進します。

559 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 13:06:41 ]
だから言ったじゃねえかよ。
あと、再帰でも、無駄なコピーなしに実装できる。
絶対できないとか頑張ってないで、ちょっと考えてみ。



560 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 13:48:49 ]
学生だと思うけど若い割に頭硬そうだよな
アルゴリズム関係は向いてないんじゃないかね

561 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 18:12:27 ]
>>559
二重ポインタか参照を使わないと無理ではないでしょうか?

562 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 19:54:07 ]
出来るって言ってんのにわからんガキだな〜
人を疑う前に少しは考えろよ

563 名前:デフォルトの名無しさん mailto:sage [2010/09/20(月) 13:34:24 ]
>>552
嘘書くなよ

564 名前:デフォルトの名無しさん mailto:sage [2010/09/21(火) 07:13:43 ]
嘘ってこともないだろ。判り難い説明ではあるが。

565 名前:デフォルトの名無しさん mailto:sage [2010/09/27(月) 23:59:03 ]
面倒だから型の左側以外に const 使うなよ。
const int* a とかにしとけ。
int const *aとか使わんだろ。

566 名前:デフォルトの名無しさん mailto:sage [2010/09/28(火) 00:29:20 ]
int * const a

567 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 17:10:52 ]
const int const *a;

568 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 17:52:31 ]
>>567
勉強しなおそうね

569 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 17:58:19 ]
>>567
int const * const a;
or
const int * const a;



570 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 18:31:19 ]
>>569
上と下はどうちがうの?

571 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 18:57:08 ]
>>570
かわらない。

572 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 19:17:28 ]
えっ

573 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 19:22:55 ]
>568
修飾子が被っているが無視されるので問題ない
まぁ、書いた人はそんなこと意図していなかっただろうけど

574 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 19:25:25 ]
>>571
どっちが正しいっていうか一般的っていうか

575 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 20:27:37 ]
どっちも正しい

576 名前:デフォルトの名無しさん mailto:sage [2010/10/24(日) 18:26:18 ]
const int const * const a;

577 名前:デフォルトの名無しさん mailto:sage [2010/10/24(日) 19:10:29 ]
だから被ってるって、まぁいいけどね

578 名前:デフォルトの名無しさん mailto:sage [2011/02/06(日) 02:34:02 ]
ひっかけ問題みたいだから。

579 名前:デフォルトの名無しさん [2011/02/06(日) 10:06:34 ]
>>573
被ってはいないだろ



580 名前:デフォルトの名無しさん mailto:sage [2011/02/06(日) 10:48:42 ]
>>579
○ const int
○ int const
× const int const

○ const int * const
○ int const * const
× const int const * const

○ const int *
○ inst const *
× const int const *

○ int * const

○ int *


581 名前:デフォルトの名無しさん mailto:sage [2011/02/06(日) 11:55:22 ]
>>580
> ○ const int *
> × inst const *
○ int const *
inst になってしまそうになる気持はわかる


582 名前:デフォルトの名無しさん mailto:sage [2011/02/06(日) 16:59:24 ]
int const C::* p; // Cはクラス型
C* c;
c->*p;

583 名前:デフォルトの名無しさん mailto:sage [2011/02/07(月) 11:33:10 ]
我々のポインタ。いやらしい・・・

584 名前:デフォルトの名無しさん mailto:sage [2011/02/21(月) 22:33:30.98 ]
ぬるぽ

585 名前:デフォルトの名無しさん mailto:sage [2011/02/27(日) 00:22:54.55 ]
int const * const ** const *p;
コンストintへのポインタへのコンストポインタへのポインタへのコンストポインタでOK?

586 名前:デフォルトの名無しさん mailto:sage [2011/02/27(日) 00:29:38.88 ]
間違ってるぞ

587 名前:デフォルトの名無しさん mailto:sage [2011/02/27(日) 01:21:24.77 ]
指定子に対する const 以外はすべて後方から修飾。
(指定子に限りどちらからでも修飾可能)
マンバポインタといっしょで *const で一塊と見たほうがわかりやすいね。

int *p;
int ( *func )();

int *const q = p;
int ( *const funk )() = func;

class C;
int C::* r;
int ( C::* funx )();

588 名前:デフォルトの名無しさん mailto:sage [2011/02/27(日) 21:17:19.78 ]
う〜、マンバ!!

589 名前:デフォルトの名無しさん mailto:sage [2011/03/04(金) 21:22:36.79 ]
char *abc[][3] = {
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
};
で初期化出来ますが、
*abc[][3] の配列(というか *abc[][3] を指すポインタ)は、
char **xyz[][3] = {abc, def, ...};
じゃ代入出来ないんですけど、
どう書いたら良いでしょうか?



590 名前:デフォルトの名無しさん mailto:sage [2011/03/05(土) 00:30:23.52 ]
*[][3]のポインタは、*(*[][3])ね
*abc[][3]に対して、abcは*(*)[3]ね
&abcは、*(*)[][3]ね
char *(*xyz)[3] = abc;

{abc, def, ...}は、配列とかにしたいんだろうから
char *(*xyz[])[3] = {abc, def, ...};
配列にしたいので、xyz[]になる

591 名前:デフォルトの名無しさん mailto:sage [2011/03/05(土) 00:43:58.31 ]
ありがとうございます

char *(*xyz[])[3] = {abc, def, ...};

ならいけますが

 char *(*xyz[])[3] = {
{
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
},
{
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
},
{
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
},
...
};

は無理ですよね?

592 名前:デフォルトの名無しさん mailto:sage [2011/03/05(土) 00:52:24.23 ]
char *xyz[][4][3] = {略};

{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
}
が[4][3]
""が*
その配列なので、[]
char *(xyz[])[4][3]の方がわかりやすいかな

593 名前:デフォルトの名無しさん mailto:sage [2011/03/05(土) 06:04:54.10 ]
あ、説明不足でした。すみません。
char *abc[][3] = {
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
...
...
...
};
なら縦方向に可変長に出来るのに、
 char *(*xyz[])[3] = {
{
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
},
{
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"}
},
{
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"aho", "baka", "shine"}
},
...
...
};
は無理ですよね?
ってことです。

594 名前:デフォルトの名無しさん [2011/03/05(土) 06:14:40.27 ]
馬鹿には無理

595 名前:デフォルトの名無しさん [2011/04/11(月) 21:47:20.95 ]
馬鹿ばっかだな。
**、が何示してるか分からないだろ。


596 名前:デフォルトの名無しさん mailto:sage [2011/04/12(火) 22:33:04.77 ]
>>593
二次元配列へのポインタを[]を使わないで書けるようにまずはなれ

597 名前:デフォルトの名無しさん mailto:sage [2011/04/15(金) 01:00:43.52 ]
>>71
> ">私のささやかな経験から言わせてもらうと、伝統的に大学のコンピュータ
> サイエンスのカリキュラムで教えられているもので、多くの人がうまく理解
> できないものが2つあった: ポインタと再帰だ。
> "
なんか再帰が苦手だったというか、最初ハノイの塔とかでも自分で自分を呼ぶというのが
どうもよくわからなくて苦労したが、同じ名前の関数を呼ぶと考えたらあっさり理解できたな
初心者の頃。
でもトレースするのはやっぱり苦手。

598 名前:デフォルトの名無しさん mailto:sage [2011/04/15(金) 12:01:39.81 ]
>>597
自分で自分を呼ぶと考えるからややこしいんだよ。
例えば階乗なんてこれだけだ。

自然数nの階乗とは:
nが0か1の場合、1
そうでない場合、n-1の階乗にnをかけた結果

これをCでそのまま書くだけ。
unsigned factrial(unsigned n)
{
if (n == 0 || n == 1) return 1;
return factrial(n - 1) * n;
}
ハノイの塔だろうがフィボナッチ数列だろうがツリー探索だろうがみんなこれの応用だ。
なんなら解説してもいいけど、ここではスレ違いだな。

599 名前:デフォルトの名無しさん mailto:sage [2011/04/15(金) 12:18:02.65 ]
すみません
末尾再帰は単純なループに置き換え可能だそうですが
>>598 はどうなりますか?



600 名前:デフォルトの名無しさん mailto:sage [2011/04/15(金) 13:00:03.37 ]
>>599
考え方をちょっと変える必要がある。

>自然数nの階乗とは:
>nが0か1の場合、1
>そうでない場合、n-1の階乗にnをかけた結果

ここで、n-1の階乗を返す関数の代わりにn-1の階乗にnをかけた結果を返す関数を用意する。

unsigned fact_sub(unsigned n, unsigned r)
{
if (n == 0 || n == 1) return r; // 0! * r or 1! * r
return fact_sub(n - 1, n * r); // (n-1)! * r
}

これを呼ぶように>598を書き換える。
unsigned factrial(unsigned n)
{
return fact_sub(n, 1);
}

C++なら、unsigned factrial(unsigned n, unsigned r = 1)としてしまえば一関数で済む。
尤も、こんなことするまでもなく最近のgccは>598をループに書き換えるけどね。

601 名前:デフォルトの名無しさん mailto:sage [2011/04/17(日) 06:21:40.62 ]
再帰は自分自身を呼び出したとき、関数の最初に戻るのではなく
呼び出したところに関数と同じ内容のブロックがあり、
それが延々と続いてるとイメージすれば分かりやすい
それはまさにツリーと同じ構造だ

602 名前:デフォルトの名無しさん mailto:sage [2011/04/17(日) 06:44:15.01 ]
なるほど、そういう馬鹿げた置き換えイメージを持っているから、実際に
再帰で書けと言っても書けない奴が多いのか、再帰のロジックを読める
くせに書けない奴が多い理由がわかった。

603 名前:デフォルトの名無しさん mailto:sage [2011/04/17(日) 09:02:18.74 ]
そういう書けない人には
「まずuntilループに書き換える」
「ループ内で再代入する変数は全て引数として渡す」
って2点を教えてやれ

604 名前:デフォルトの名無しさん mailto:sage [2011/04/17(日) 09:04:11.42 ]
またいつもの再帰番長か。

605 名前:デフォルトの名無しさん mailto:sage [2011/04/17(日) 09:11:00.70 ]
アセンブラやらないからだよ

606 名前:デフォルトの名無しさん mailto:sage [2011/04/17(日) 21:34:44.55 ]
末尾最適化が出来る再帰と出来ない再帰があるな

例えばアッカーマン関数は末尾最適化出来ない

607 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 01:21:52.48 ]

ttp://kmaebashi.com/programmer/pointer.html
>K&Rによれば、Cの宣言は、「変数が現われ得る式の構文を真似た(P.114)」そうである。
>しかし、本質的に全く異なるものを無理に似せようとしたため、
>結局わけのわからない構文になってしまっている。

># Cの作者Dennis Ritchieが最近開発した新しい言語 Limboは、一見
># C like だが、宣言の構文はしっかりPascal風のものに直してある...
># ずるい(^^;


608 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 01:46:12.61 ]
変数宣言の*と、デリファレンスの*で混乱したのを思い出すわ。
同じ*だと思っていたからどうにも理解できなかったわ。

609 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 19:42:14.51 ]
もしもポインタの*が後置きだったら……

前置版 → 後置版

int *p; → int p*;

int (*p)[99]; → int p*[99];

int *p[99]; → int p[99]*;

int *(**p[5])[3][2]; → int p[5]**[3][2]*;

int (*pf)(void) → int pf*(void);

int (*(*(*(*pf)[5])(void))(void))[3]; → int pf*[5]*(void)*(void)*[3];

結果:
後置版はカッコを付けなくても一意的に意味がつくので、
宣言がすっきりする

後置版の方が本来は読みやすいはずだが、今のところ、
個人的にはかえって読みにくい(「*p」表記に毒されてしまったのか^p^)



610 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 20:35:44.53 ]
宣言の読み易さはともかく、それは実行コーディングの使い易さ・読み易さと
両立できるのか?

611 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 20:44:13.82 ]
掛け算との使い分けは?

612 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 20:51:39.73 ]
>>610
使い易さ・読み易さが格段に落ちることは無いと思う

ポインタpに対して、(*p)という記述を自発的に封印して
p[0]という記述に統一した場面を想像すればいい
この場合、実行コーディングの使い易さ・読み易さが
格段に落ちることは無いよね

(*seito).kokugo = 100; → seito[0].kokugo = 100;

*(*hoge).(*fuga) = NULL; → hoge[0].fuga[0][0] = NULL;

後置版の場合、(*p) が p* に置き換わるだけだから、これは
*p が p[0] に置き換わったのと同じことで、やっぱり
使い易さ・読み易さが格段に落ちることは無いのでは?

(*seito).kokugo = 100; → seito*.kokugo = 100;

*(*hoge).(*fuga) = NULL; → hoge*.fuga** = NULL;

613 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 20:57:02.70 ]
>>611
p* = 10; と p *= 10; の区別が紛らわしいって話だよね

それは別の記号を使えばいいだけでは…
ポインタの「*」には、*のかわりに@を使うことにする、とか

p@ = 10; p *= 10;

614 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 20:58:52.09 ]
玉突き衝突的にあちこちいじりまくるなら
そのままでよさそうだな

615 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 21:23:17.01 ]
>>614
弄りまくるも何も、文法的には何も弄ってないのだが…
仮に弄っているように見えたとしても、>>612-613で全て完結してる

(*p) のかわりに p[0] を使う文法は、今のままのC言語で普通に使える。
後置版を考えるというのは、「全ての(*p) を p[0] に統一しましょう」
と言っているのと同じことで、実は何も弄ってないでしょ?
( (*p)は前置き表現なのに対し、p[0]は後置き表現 )

ただ、それなら「p*」とか「p@」とか書かないで
「p[0]」でいいじゃんって話になるなw

616 名前:デフォルトの名無しさん mailto:sage [2011/04/21(木) 11:55:23.48 ]
メタやメタメタな話をすると速攻思考が固まる人がいるけど
ポインタもその類の気がする。

617 名前:デフォルトの名無しさん mailto:sage [2011/04/22(金) 09:54:08.26 ]
つまり、アリス以下なんだな。

618 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 05:57:17.53 ]
>>609では前置版とか後置版とか書いたけど、実行コーディングのときは
p[0]っていう後置版が存在してるから、わざわざp* などという後置版を
新設する意味は無かった。単にp[0]を使えばよいのだった


ならば、宣言時にもp[0]を拝借して、「int p[0];」を
ポインタの宣言として使ったらどうか?

今のC言語では、「int p[0];」という宣言は使われてない(コンパイラに怒られる)。
従って、この宣言に何か意味をつけて使用しても、問題は起きない

619 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 06:00:26.47 ]
使用例

int *p; → int p[0];

int (*p)[99]; → int p[0][99];

int *p[99]; → int p[99][0];

int *(**p[5])[3][2]; → int p[5][0][0][3][2][0];

int (*pf)(void) → int pf[0](void);

int (*(*(*(*pf)[5])(void))(void))[3]; → int pf[0][5][0](void)[0](void)[0][3];


なんか微妙だ^p^
配列との区別がつきにくい…
宣言自体は読みやすい(先頭のintを無視すれば、左から右へ英語読みできる)のだが



620 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 06:11:49.34 ]
             ___________
     ∧_∧∩ /先生!土曜日の早朝にそんなこと
    ( ´∀`)/< 考えるだけでなく、書込までするのは
 _ / /   /   \あまりにも不毛だと思います!
\⊂ノ ̄ ̄ ̄ ̄\   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ||\        \
 ||\|| ̄ ̄ ̄ ̄ ̄||
 ||  || ̄ ̄ ̄ ̄ ̄||
    .||          ||

621 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 06:32:33.92 ]
>>620
懐かしいAAまで使って凝ってるなw
そんなお前の方がよっぽど不毛だわ

622 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 10:19:21.16 ]
表記も分かりにくいけど
最大の問題点はC言語やそのライブラリが
ポインタ酷使し過ぎなことだと思う
・参照型が使える
・参照渡しが使える
・文字列は、基本型もしくは構造体である
・配列は明示しない限り範囲外アクセス不可
始めからこのくらいやれば
半端な知識の人間がポインタに触れることはまずなかったはずだし
本当にアドレスを扱いたいとき以外ポインタ使わなかったろうから
うっかりさんが大量発生することもなかっただろう

C/C++以外にも確かDelphiとかポインタあるはずだが
あんまりポインタで詰まるのを聞かない
それは本当に滅多に使わないからだと思う

623 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 11:16:02.38 ]
しかし、それをやったらCが何の為に作られたかがボケてしまう。
アセンブラの代わりに使える低水準言語でなくなる事は、本末転倒だと思う。

Cをそのように使いたいなら、C++でお茶を濁せばいいだけだと思う。

624 名前:デフォルトの名無しさん mailto:sage [2011/04/23(土) 12:23:44.25 ]
参照こそイラン。
参照なんて結局んところ、[]演算子のオーバーロード時に使いたいだけちゃうんかと。
MyData &operator[](foo f)して、mydata[bar][baz]させたいだけちゃうんかと。

625 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 03:29:25.86 ]
>>623
いや、当然C言語なんだから低水準なものは扱えるべきだよ。
何もポインタ自体を廃止しろと言ってるワケじゃない。
ポインタに依存するものが多過ぎるでしょ、って話。

626 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 03:47:38.83 ]
配列参照だとインデックスが必要
速度を上げるためのポインタ参照だから

627 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 03:53:03.71 ]
Cが特定の人々にとって分かりにくいのは確かだけど
別にシステムプログラミング用途で不合理、不適合ってわけじゃないからな。
変えろとか言われても知らんがな。

628 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 03:54:49.92 ]
つまりシステムプログラミング以外をする人は全部「特定の人々」なのか
実際は何故かプログラミングの教材にすら使われる言語なのだが

629 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 03:58:20.96 ]
だからEasy Cだかなんだか好きな言語でっちあげろよ
ごね方が謎過ぎる



630 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 12:25:36.83 ]
Joel氏の言う通り、この程度が理解できないならこの仕事するなって事だな

631 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 13:50:37.04 ]
つまりアレだな、スレタイに対する回答は
「高級言語でもないものを、高級言語であるかのように扱ったから」
だな

632 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 21:20:11.12 ]
>>631 もともと高級アセンブラだ


633 名前:デフォルトの名無しさん mailto:sage [2011/04/24(日) 21:30:52.47 ]
実際には色んなところで使われちゃうから、そこが問題点

634 名前:デフォルトの名無しさん mailto:sage [2011/04/25(月) 02:57:24.98 ]
引っ掛かる人間の割合は、さほど変わっていないと思う。
先天的に才能がない人間も、プログラミングをするようになっただけなんじゃね?

635 名前:デフォルトの名無しさん mailto:sage [2011/04/25(月) 12:39:41.86 ]
先天的に才能が無い人間がいきなりCに触っちゃう機会があること自体がおかしい

636 名前:デフォルトの名無しさん mailto:sage [2011/04/25(月) 18:54:12.21 ]
Cってかっこいいの?

637 名前:デフォルトの名無しさん mailto:sage [2011/04/25(月) 18:55:36.13 ]
C△

638 名前:デフォルトの名無しさん mailto:sage [2011/04/27(水) 08:05:24.62 ]
Cが駄目ならGoを使えばいいじゃない。

639 名前:天使 ◆uL5esZLBSE mailto:sage [2011/07/04(月) 23:31:18.49 ]
これ ; デリミタっていうんだけどさ、これをつけなきゃエラーになるような
そんな言語使ってる奴ってどうみてもゴミだと思うんだけど

もしかして「;」これ打ち忘れてコンパイルエラー出すのが楽しいの?
そうか、二度と話かけんなよ
ゴミは何いってもゴミ



640 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 02:37:31.17 ]
天使ちゃんマジ天使

641 名前:天使 ◆uL5esZLBSE mailto:sage [2011/07/06(水) 15:13:34.56 ]
∨∨∨
「「「「「 つまりアレだな、スレタイに対する回答は 」」」」」(キリ
∧∧∧∧∧∧∧∧∧∧(きリッッ!キリッッッッ!!きリッ!!!キリッッッッ!!!!

「「「「「 「高級言語でもないものを、高級言語であるかのように扱ったから」 」」」」」(←きリッッッ!!!!キリッッ!!!!
∧∧∧(キリ!!

642 名前:デフォルトの名無しさん mailto:sage [2011/11/11(金) 10:08:45.32 ]
ポインタなんて出来るだけ使わなければ良い。

Cが出た頃の昔はポインタで高効率とかあったけど、
今のコンパイラなら最適化が優れてるから
無理に使う必要ない。

ワザと判り難いプログラミングの手本見て、
真似するとか低脳な教え手から習うなよw

コンパイラがショボかった昔の技法なんだよ。

643 名前:デフォルトの名無しさん mailto:sage [2011/11/11(金) 14:31:23.82 ]
クソ本が巷に溢れてるのが悪い

644 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 15:15:53.57 ]
>>20
sizeof(b)=8;
になるのは何で?bはint型だから4じゃないの?

645 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 18:25:06.21 ]
すくなくともintじゃなくて
int *だわな。

646 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 18:26:17.39 ]
アドレッシングが64BITの環境かもしれんし。

647 名前:デフォルトの名無しさん mailto:sage [2012/03/04(日) 21:32:57.04 ]
ポインタの理解に苦しむこと30年、その間書籍も20冊以上買ったが
全くモノにならなかった。

しかしついさっき、ようやく、ようやく開眼した。
ポインタ変数と、それが指し示すデータの実体を
同じメモリの中で考えるから位置関係が気になって混乱する。

メモリが一つで一直線にあるのではなく、
データ専用のメモリと、ポインタ専用のメモリが別々にあると
考えて、二つを並べることで理解できた。

つまり地面にメモリが二本垂直に突き立っているイメージ。
右のメモリにはデータがあり、
左のメモリにはポインタ変数があって右のメモリのアドレスを指している。
ポインタのポインタなら、三本めのメモリが立っていて
真ん中のメモリのアドレスを指している。
こんな簡単なことだったんだ。

人生が開けた感じ。とても清々しい気持ちだ。
次は構造体を頑張るぞ。

648 名前:デフォルトの名無しさん mailto:sage [2012/03/04(日) 23:30:43.74 ]
ポインタをインクリメントしてデータを破壊しても、原因が理解できなかったりw
30年もかかるんなら、プログラマに向いてねぇよ


649 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 00:14:24.98 ]
ダメだこりゃ。



650 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 00:18:44.22 ]
アドレスって名前はダテでは無いんだけどなー。
>>647の頭の中ではMapみたいにkey領域とvalue領域があるのかなー・・・。

651 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 01:12:04.93 ]
人が人生のすばらしさに目覚めて感動しているのに
相変わらず君らはレベルの低いレスを付けるのだな。
ポインタで引っかかる人は、みな私のように
頭の中にメモリのイメージを作れずに苦労しているのだよ。
二段メモリの概念は素晴らしい。これでポインタの本を書けるかも。

私を30年も苦労させたリッチーを、卒業祝いに一発殴りたいところだが
亡くなったそうだからチャラにしてやる。
これからはプログラムを作りまくるぞー。

652 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 08:33:39.67 ]
いや30年わからないってそれ明らかに向いてないから

653 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 10:13:34.99 ]
俺の理解だと int *hoge; の場合、宣言してるのはhogeという変数。
*をつけると変数の中身をアドレスにしてアクセスする。アクセス先の型はintとする。

最初に*hogeはint型だが、*を外したらアドレスになる、と覚えようとしたら混乱した。

654 名前:デフォルトの名無しさん mailto:sage [2012/03/06(火) 07:45:17.53 ]
>>653
そこで多段メモリですよ。
以下のようにイメージすれば、ポインタなんて簡単だ。
先にも言ったとおり、初心者がポインタでつまづくのは、
リニアなメモリの中にデータとポインタが混在したイメージを
頭の中で処理しきれないから。
だったら、処理しやすいイメージに変えてしまえば良い。
実際のメモリ配置がコンパイラの実装に依存する以上、
このイメージが決定的にまずいということはないはず。

1.右のメモリにはデータがある
2.真ん中のメモリには1へのポインタ変数がある
3.左のメモリには2へのポインタ変数がある
4.ポインタ変数に付く*の数は、その変数のあるメモリの
何段前のメモリを見に行くかを示すものである

655 名前:デフォルトの名無しさん mailto:sage [2012/03/06(火) 08:24:45.30 ]
リンクドリストは要素の数だけメモリがあるのか。大変だな。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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