C言語関係掲示板

過去ログ

No822 ポインタの参照と掛け算(2**p)

[戻る] [ホームページ]
No.10402

ポインタのついて
投稿者---あり(2003/11/10 16:27:49)


お聞きしたいのですが、
”*pa”と”**pa”。
ポインタが1つと2つの違いがわからないので、
教えていただけませんか?


No.10407

Re:ポインタのついて
投稿者---たか(2003/11/10 17:21:12)


>お聞きしたいのですが、
>”*pa”と”**pa”。
>ポインタが1つと2つの違いがわからないので、
>教えていただけませんか?

全く違います。例えば基本データ型をintとするとint *paとはint型への
ポインタで、int **paとするとこれはint型へのポインタのポインタです。

int i = 1;
int *p;
int **pp;

p = &i;
pp = &p;

printf("%d %d", *p, **pp);

という事でppは参照が一段深い事が分かります。

No.10408

Re:ポインタのついて
投稿者---JUN2(2003/11/10 17:35:03)


>お聞きしたいのですが、
>”*pa”と”**pa”。
>ポインタが1つと2つの違いがわからないので、
>教えていただけませんか?

1つはポインタ。
2つはポインタのポインタ。

int data;
int* p;
int** pp;

data =123;
p = &data;
pp = &p;

上記の場合、
1.&dataはdata(123)が格納されているアドレスを示す。
2.変数pの値は、dataの格納されているアドレス。
3.変数ppの値は、dataの格納されているアドレスが格納されている
  アドレス。
4.*pはdataの値(123)。
5.**ppもdataの値(123)。
6.*ppはdataの格納されているアドレス。

1と2と6が同じでdataの格納されているアドレス。
4と5が同じでdataの値(123)。
3は上記の通り。


No.10409

Re:ポインタのついて
投稿者---ぷりん(2003/11/10 17:54:36)


わかりました。
本当にありがとうございました。
もっと、勉強します。


No.10504

*ポインタの参照と掛け算
投稿者---ceybord(2003/11/15 08:20:54)


2**p
とか書いても2かける*pの意味になるのですか?
3/*p
とか書いても大丈夫ですか?
コメントの入れ子に対応したコンパイラで困りそうですが。
3 / *p
のように書けば絶対に大丈夫ですか?

No.10517

Re:*ポインタの参照と掛け算
投稿者---YuO(2003/11/15 16:45:20)


2**p
とか書いても2かける*pの意味になるのですか?


なります。
コンパイラは,まず,2**pを次のようにトークンに分割します。
定数
2
区切り子
*
区切り子
*
識別子
p

そして,次のように解析されます。
・expression
  ・assignment-expression
    ・conditional-expression
      ・logical-OR-expression
        ・logical-AND-expresssion
          ・inclusive-OR-expression
            ・exclusive-OR-expression
              ・AND-expression
                ・equality-expression
                  ・relational-expression
                    ・shift-expression
                      ・additive-expression
                        ・multiplicative-expression
                          ・multiplicative-expression
                            ・cast-expression
                              ・unary-expression
                                ・postfix-expression
                                  ・primary-expression
                                    ・constant(2)
                          ・cast-expression
                            ・unary-expression
                              ・unary-operator(*)
                              ・unary-expression
                                ・postfix-expression
                                  ・primary-expression
                                    ・primary-expression
                                      ・identifier(p)


解析時に,unary-expressionよりも先にmultiplicative-expressionが処理されます。
故に,2**pは2 * (*p)と処理されます。
この解析順序をわかりやすく表にしたのが,演算子の優先順位表です。


3/*p
とか書いても大丈夫ですか? コメントの入れ子に対応したコンパイラで困りそうですが。


大丈夫とは?
/*から先はコメントとしてtranslation phase 3で処理されます。


3 / *p
のように書けば絶対に大丈夫ですか?


3, /, *, pとトークンに分割されますから,コメントと見なされることは絶対にありえません。


No.10539

Re:Re:*ポインタの参照と掛け算
投稿者---ceybord(2003/11/16 12:22:09)


私はexpressionがいっぱい並んでいるのは初めて見ました。
コンパイラにはそういう記述があるのですね。
基本的にコメントの入れ子はコンパイラがサポートしても使わず、
割り算するときはa/ *p のように書けばいいのですね。

No.10540

Re:*ポインタの参照と掛け算
投稿者---かずま(2003/11/16 12:40:29)


> そして,次のように解析されます。

終端記号が
>                                     ・constant(2)
>                               ・unary-operator(*)
>                                       ・identifier(p)

の 3つしかありませんよ。

multiplicative-expression:
    multiplicative-expression * cast-expression

ですから、

>                           ・cast-expression
の前に
                            ・(*)
を追加。

それから、
>                                   ・primary-expression
>                                     ・primary-expression

これは変ですね。2つ目の primary-expression は不要でしょう。


No.10552

Re:*ポインタの参照と掛け算
投稿者---YuO(2003/11/16 21:19:20)


multiplicative-expression:
    multiplicative-expression * cast-expression
ですから、
>                           ・cast-expression
の前に
                            ・(*)
を追加。

それから、
>                                   ・primary-expression
>                                     ・primary-expression
これは変ですね。2つ目の primary-expression は不要でしょう。


うぐっ。
みなおした……つもりだったんだけどなぁ……。

ご指摘どうもです。
#自動変換させるツールでも作るかなぁ……。


No.10544

Re:*ポインタの参照と掛け算
投稿者---かずま(2003/11/16 16:56:58)


> 解析時に,unary-expressionよりも先にmultiplicative-expressionが処理されます。
> 故に,2**pは2 * (*p)と処理されます。

この説明だけでは不十分です。もしそれだけなら、次のような誤解をされそうです。

  unary-expression よりも先に additive-expression が処理されます。
  故に、a++b は a + (+b) と処理されます。

すなわち、構文解析より前に、語彙解析があって、
2**p は、2、*、*、p の 4つのトークンに分けられるという説明を追加しないと
いけないのではないでしょうか。

a++b は、a、++、b の 3つのトークンに分けられます。


No.10553

Re:*ポインタの参照と掛け算
投稿者---YuO(2003/11/16 21:19:24)


> すなわち、構文解析より前に、語彙解析があって、
> 2**p は、2、*、*、p の 4つのトークンに分けられるという説明を追加しないと
> いけないのではないでしょうか。

一応,トークン分割の話を先に持ってきておいたのですが……。
2, *, *, pに分割されることは,先頭に書いてありますよ。


No.10568

Re:*ポインタの参照と掛け算
投稿者---かずま(2003/11/17 00:24:30)


> 一応,トークン分割の話を先に持ってきておいたのですが……。
> 2, *, *, pに分割されることは,先頭に書いてありますよ。

これは失礼しました。
>                      ・primary-expression
>                         ・primary-expression
>                           ・identifier(p)
ここが変だな、と考えていて、最初のほうのことを忘れてしまったようです。