ポインタのサイズ

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

ポインタのサイズ

#1

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

ポインタのサイズについてご質問します。
int x[5];と宣言をすると、これのサイズsizeof(x)は20になります。※開発環境はVisualC++6.0です。
型はint *[5]でサイズが4つの配列が5個あるので4x5=20というのが出てきます。

次に配列にアドレス演算子&をつけます。配列にアドレス演算子&をつけると配列全体へのポインタになります。
これのサイズsizeof(&x)も20になります。型はint (*)[5]になり前者とは異なり、5個の配列へのポインタ
ということになります。これはあくまでポインタなのですがこのポインタのサイズが20になる理由を教えて下さい。
直感的にはわかるのですが、ちゃんと理解しておきたいのでお願いします。

toyo

Re:ポインタのサイズ

#2

投稿記事 by toyo » 16年前

ポインタなのに20になる方がおかしい気がします
Cygwin の gccと Visual C++2008ではsizeof(&x)は4になりました
sizeof(x)についてはそういう決まりがあるので配列のサイズになります

研修生

Re:ポインタのサイズ

#3

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

debugでsizeof(&x)の中身自体をみると4でしたがいざ実行したら20になりました

box

Re:ポインタのサイズ

#4

投稿記事 by box » 16年前

> debugでsizeof(&x)の中身自体をみると4でしたがいざ実行したら20になりました

そのソースコードを見せてください。

研修生

Re:ポインタのサイズ

#5

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

int main()
{
  int x[5];
  printf("%u",(unsigned)sizeof(&x));
  return 0;
}
です

Blue

Re:ポインタのサイズ

#6

投稿記事 by Blue » 16年前

>開発環境はVisualC++6.0です。
バグらしい。
http://f4.aaa.livedoor.jp/~pointc/No.22309.html

どうせ、適切な回答がもらえないとかいってまるちぽすとするんだろうな


研修生

Re:ポインタのサイズ

#8

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

バグでしたか。納得です。

dic

Re:ポインタのサイズ

#9

投稿記事 by dic » 16年前

こういうことです
#include <stdio.h>

int main()
{
  int x[5];
  printf("xのサイズ:%u\n",(unsigned)sizeof(&x));
  printf("x[0]のサイズ:%u\n",(unsigned)sizeof(&x[0]));
  return 0;
}

dic

Re:ポインタのサイズ

#10

投稿記事 by dic » 16年前

と思ったんですが
下のコードは期待どおりには動いてくれませんね
#include <stdio.h>

int main()
{
  char	c[5];
  printf("cのサイズ:%u\n",sizeof(&c));
  printf("c[0]のサイズ:%u\n",sizeof(&c[0]));

  return 0;
}
VC++6.0 のバグでしょうかね

dic

Re:ポインタのサイズ

#11

投稿記事 by dic » 16年前

返答者が頭がこんがらがって・・・
#include <stdio.h>

int main()
{
  char	c[5];
  printf("cのサイズ:%u\n",sizeof(&c));
  printf("c[0]のサイズ:%u\n",sizeof(&c[0]));
  printf("c[0]のサイズ:%u\n",sizeof(c[0])); // ←これ

  return 0;
}
char c[5]
&c[0] は アドレスなので4バイトですね
c[0] が 1バイトですね

すいません

バグではないですね

dic

Re:ポインタのサイズ

#12

投稿記事 by dic » 16年前

うわっちゃ~
またミスってますね
No:32948 の返信は微妙に間違ってます
正確なソースは以下のようになります
#include <stdio.h>

int main()
{
  char	c[5];
  printf("cのサイズ:%u\n",sizeof(&c));
  printf("c[0]のアドレスのサイズ:%u\n",sizeof(&c[0]));
  printf("c[0]のサイズ:%u\n",sizeof(c[0]));

  int	x[5];
  printf("xのサイズ:%u\n",sizeof(x));
  printf("x[0]のアドレスのサイズ:%u\n",sizeof(&x[0]));
  printf("x[0]のサイズ:%u\n",sizeof(x[0]));
  return 0;
}
ポインタでつまづくとは・・・
私もまだまだですね

dic

Re:ポインタのサイズ

#13

投稿記事 by dic » 16年前

なんかひとり勘違いをしていたようですね

#include <stdio.h>
int main()
{
	int	x[5];
	printf( "xのサイズ:%u\n",sizeof(&x));
	printf( "x[0]のアドレスサイズ:%u\n", sizeof(&x[0]) );
	printf( "x[0]のサイズ:%u\n", sizeof(x[0]) );

	int	y;
	printf( "yのサイズ:%u\n", sizeof(&y) );

	return 0;
}
int x[5] と配列を宣言したので
sizeof(&x) としたら int x[5] の全体のサイズを返すので 20 です

sizeof(&x[0]) = 4 byte
sizeof(&x[1]) = 4 byte
sizeof(&x[2]) = 4 byte
sizeof(&x[3]) = 4 byte
sizeof(&x[4]) = 4 byte
合計20バイトです

int x と単品で宣言し
sizeof(&x) としたら int x のアドレスのサイズを返すので 4 です

もうすこし char でポインタの勉強をし、
理解できたら int型にチャレンジした方が良いかと思います

YuO

Re:ポインタのサイズ

#14

投稿記事 by YuO » 16年前

お願いだから「ポインタのサイズ2」の私の投稿 (No.32944) を読んでほしい……。

> int x[5] と配列を宣言したので
> sizeof(&x) としたら int x[5] の全体のサイズを返すので 20 です

&xはint (*)[5]型の値,つまりポインタなのでVC++6の場合は4を返すのが「本来」正しいです。
sizeof(x)は20を返すのが正しいですが。


> もうすこし char でポインタの勉強をし、
> 理解できたら int型にチャレンジした方が良いかと思います

これはそっくりそのままdicさんに跳ね返ってきますよ。

dic

Re:ポインタのサイズ

#15

投稿記事 by dic » 16年前

int x[5];
sizeof(&x) が20を返し
sizeof(x) も20を返すのでおかしいのではないのか?
ということですね

ようやく理解できました

閉鎖

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