ポインタのサイズ2

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
研修生

ポインタのサイズ2

#1

投稿記事 by 研修生 » 16年前

もう少しきちんと理解しておきたいのでご質問します。
int x[5];
int* p1 = x;
int(*p2)[5] = &x;



1,sizeof(x)
2,sizeof(&x);
3,sizeof(*x);
4,sizeof(p1);
5,sizeof(*p1);
6,sizeof(p2);
7,sizeof(*p2);

の値がどうなるか考えたいと思います。処理系がVisualC++6.0なのでintはサイズ4です。
1,ポインタが5個の配列の型はint *[5]で4x5=20

2,前質問でもありましたが、int(*)[5]で5個の配列へのポインタでサイズは4です。

3,型はint (**)[5]であくまでポインタなのでサイズは4?

4,型はint (**)[5]なので3と同じく4?

5,型はint (***)[5]で4?

6,型は・・??でサイズは??

7,型は・・??でサイズは??

1と2は合ってるとは思うのですが3,4,5は確信があやふやなのでご指摘いただければと思います。
6,7は型もサイズもわかりません。教えて下さい。

YuO

Re:ポインタのサイズ2

#2

投稿記事 by YuO » 16年前

VC++6とのことなので,通常のポインタはすべて4バイトですね。
sizeof(int) == sizeof(int *)なので4とあるとどちらかわかりにくくなってしまいます。
このため,intをすべてcharに置き換えて書いてみます。

> 1,sizeof(x)

x : char [5] // array[5] of char
よって,
sizeof(x) = sizeof(char [5]) = sizeof(char) * 5 = 1 * 5 = 5

> 2,sizeof(&x);

x : char [5]
&x : char (*)[5} // pointer to array[5] of char
よって,
sizeof(&x) = sizeof(char (*)[5]) = 4

> 3,sizeof(*x);

x : char [5] // 配列型の一次式は特定の演算子以外に対して先頭要素へのポインタに変換 : char *
*x : char // char
よって
sizeof(*x) = sizeof(char) = 1

> 4,sizeof(p1);

p1 : char * // pointer to char
よって
sizeof(p1) = sizeof(char *) = 4

> 5,sizeof(*p1);

p1 : char *
*p1 : char
よって
sizeof(*p1) = sizeof(char) = 1

> 6,sizeof(p2);

p2: char (*)[5]
よって
sizeof(p2) = sizeof(char (*)[5]) = 4

> 7,sizeof(*p2);

p2: char (*)[5]
*p2 : char [5]
よって
sizeof(*p2) = sizeof(char [5]) = sizeof(char) * 5 = 1 * 5 = 5

研修生

Re:ポインタのサイズ2

#3

投稿記事 by 研修生 » 16年前

納得しました。ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る