Togetter/min.tを安心してお使い頂くためのガイドラインを公開しました。
2010年2月17日

C/C++ ポインタの分かりにくさに混乱しる

ここらへんで話のあったポインタの分かりにくさについてニコ生でざっと説明します。・・・・・というわけでその資料。
3
@mohhie

C++はC互換を切り捨てないとカオスが広がるだけだと思うけど、切り捨てたら存在価値がないというジレンマ。

2010-02-17 13:01:31
@mohhie

ポインタで訳がわからないのは、*が何の演算子なのかがパットわからないところ

2010-02-17 13:18:28
@mohhie

int*a;とするとaは中身ではなくなる。つまり*は中身ではなくアドレスを表すようにする演算子と考えられるのに、a = * 1が通らないとか

2010-02-17 13:33:27
@mohhie

int a=1;int*bと定義しておいて、b=&a;は通る。&は*と逆の意味なんだろうと思って*b=aとすると落ちるとか何なの

2010-02-17 13:40:43
かわ @kawa1128

@mohhie 逆の意味という理解が間違っていると思われます。

2010-02-17 13:41:54
かわ @kawa1128

@mohhie ごめん、間違えた。*bというのを宣言して、領域を確保する前に代入してない?b=&a;したあとで、*b=a;とすれば、通ると思うよ。未確認だけど。

2010-02-17 13:48:03
@mohhie

int* aという宣言は、アドレス型という意味で考えると &int a が正しいと思うんだが、パース出きなかったのかな。それとも int *aと考えて、実態はintのaと捉える方がいいんだろうか。

2010-02-17 13:53:09
@mohhie

ただ、キャストで(int*)とかするから、やっぱりパース出きなかったので後ろに置きました、後ろに置いたので意味逆にしました、ゴメンナサイ。と捉えるのが良いんだろう。

2010-02-17 13:54:31
かわ @kawa1128

@mohhie 落ちなかった。。。。。。 orz.

2010-02-17 13:57:59
@mohhie

@kawa1128 int a=1;int a2=2;int*b;b=&a;*b=a2;とするとOKです

2010-02-17 13:59:46
かわ @kawa1128

ざっくりと。宣言時の*は、ポインタがただよという宣言。その他の部分では、ポインタの示す中身。&は、変数のアドレスという理解でよかったのか、記憶があいまいになってきた。だれか、詳しい人教えて。

2010-02-17 14:00:42
@mohhie

int a =1があるとして int* b = &a;ってどう考えても納得いかない。 せめて int &b = &aだろうと

2010-02-17 14:02:43
@mohhie

型として指定したいなら &int a = &b だろうと

2010-02-17 14:05:20
かわ @kawa1128

@mohhie その理論で行くと、char& s[10] ="";っていうこと?!

2010-02-17 14:09:09
くっくっkura 🇯🇵 @PG_kura

@mohhie @kawa1128 携帯から説明するのは辛いので、誰もこの後Reply しなかったら、今夜あたり説明放送しよかなと。

2010-02-17 14:13:17
かわ @kawa1128

@PG_kura おお、助かる。C/C++から離れてはや6,7年。すっかり忘れてしまっています。

2010-02-17 14:17:33
@Ryushi_PSP

@kawa1128 その理論だと、s[10]がポインタの配列になってしまうのでNGじゃないですかね

2010-02-17 14:18:19
@Ryushi_PSP

. @kawa1128 @mohhie char型の配列sがあるとして、「s」は配列の先頭の要素のアドレス(つまり「&s[0]」)を指すので、その理論だと「char& a=s;」「char& b=&s[0];」は通ると思います。宣言時は普通に「char s[10];」でおkかと

2010-02-17 14:27:55
@Ryushi_PSP

その理論だと「char a;」「char b[10];」のような変数があったとすると、「char& s[10];」 だと、 「s[0] = &a;」「s[1] = b;」「s[2] = &b[0];」のようなパターンが通ると思います

2010-02-17 14:30:30
@Ryushi_PSP

・・・・マズったかなw

2010-02-17 14:31:58
@Ryushi_PSP

. @yreeen @kawa1128 @mohhie その理論の「char& s[10];」って従来の「char *s[10];」と同じじゃないんですか?

2010-02-17 14:44:24
かわ @kawa1128

&char s[10]の間違いです。@mohhie は結局宣言時の*の使い方がおかしいだろとういう指摘に対して、s[10]っていう宣言も意味から考えれば、おかしいだろうというのが、自分の論点。

2010-02-17 14:46:46
@Ryushi_PSP

あ、なるほど・・理解。 RT @kawa1128: &char s[10]の間違いです。@mohhie は結局宣言時の*の使い方がおかしいだろとういう指摘に対して、s[10]っていう宣言も意味から考えれば、おかしいだろうというのが、自分の論点。

2010-02-17 14:47:50
@mohhie

配列について。キャストする時にどう書くのかをかんがえると(char[])がベストかと。char* s[10]は何を宣言してるのか意味不明。&char[] s = &char[10]のシンタックスシュガーと考えると、&char[] s[10]になるけど、そんな糖衣はいらん。

2010-02-17 16:00:03
@mohhie

ポインタが配列と等価だとすると&char s = char[10]でもいい気がするが、配列の配列はどうなるのか

2010-02-17 16:24:09
残りを読む(11)

コメント

コメントがまだありません。感想を最初に伝えてみませんか?