2

これが私のサンプルコードです

#include<stdio.h>
void main()
{
 int arr[]={1,2,3,4,5,6};
 char *ptr,a;
 a='c';
 ptr=&a;
 int *ptr1,a1;
 a1=4;
 ptr1=&a1;
 printf("%d  %d   %d",sizeof(arr), sizeof(ptr1), sizeof(ptr));
}

さて、私が理解している限り、size ofは変数を格納するために必要なサイズを教えてくれますが、これの出力は次のようになります。

24 4 4

なぜのサイズなのかarr=24、結局のところ、それは単なるポインタであり、サイズ= 4である必要がありますか?

ありがとう。

4

5 に答える 5

5

「...結局のところ、それは単なるポインタです...」?いいえ。配列はポインタではありません。配列は配列オブジェクトです。配列要素を格納するメモリの堅固な連続ブロックであり、いかなる種類のポインタも含まれません。あなたの場合、配列にはそれぞれサイズ4の6つの要素があります。sizeofそれがあなたが24と評価する理由です。

配列がポインタであるという一般的な誤解は何百万回も明らかにされてきましたが、どういうわけかそれは時々現れ続けます。FAQを読んで、質問があれば戻ってきてください

http://c-faq.com/aryptr/index.html

PS @Joachim Pileborgが彼の回答で正しく指摘しているようにsizeof、関数ではありません。オペレーターです。


配列がポインターとは異なる動作をするもう1つのコンテキストは、単項&演算子(「アドレス」演算子)です。unary&がタイプのポインタに適用されると、タイプint *のポインタが生成されますint **。unary&が型の配列に適用されると、型int [10]のポインタが生成されますint (*)[10]。これらは2つの非常に異なるタイプです。

int *p = 0;
int a[10] = { 0 };

int **p1 = &p;      /* OK */
int **p2 = &a;      /* ERROR */
int (*p3)[10] = &a; /* OK */

これは、質問(およびエラー)のもう1つの一般的なソースです。配列に適用すると&、ポインターが生成されることを期待する場合があります。int **int [10]

于 2012-12-02T18:10:34.967 に答える
0

配列がある場合は、配列のサイズを返します(配列内のアイテムの数ではなく、配列のバイト単位sizeofのサイズであることに注意してください)。それ以外の場合は、型または式のサイズを返します。

ただし、配列を関数に渡すと、配列はポインターに劣化し、サイズ情報は失われます。

また、技術的に言えばsizeof、関数ではなく、言語の特別なキーワードであり、式とともに使用する場合は、括弧なしでも使用できます。

于 2012-12-02T18:10:19.220 に答える
0

配列は内部のポインタに減衰しませんsizeofsizeof(arr)配列に割り当てられた合計サイズを返します。この場合はです6 * sizeof(int)

于 2012-12-02T18:10:39.723 に答える
0

ウィキペディアから

sizeofを配列の名前に適用すると、結果は配列全体のバイト単位のサイズになります。(これは、配列の名前が配列の最初の要素へのポインターに変換されるという規則の数少ない例外の1つです。)

于 2012-12-02T18:10:52.453 に答える
0

演算子は、sizeof()配列内の要素の数を提供するのではなく、モノがメモリ内で占有するバイト数を提供します。したがって:

#include <stdio.h>

int main()
{
  char s[] = { 1, 2, 3, 4, 5, 0 };
  int xs[] = { 1, 2, 3, 4, 5, 0 };

  printf( "sizeof( s ) = %d\n",  sizeof( s  ) );
  printf( "sizeof( xs ) = %d\n", sizeof( xs ) );

  return 0;
}

sizeof( s ) = 6
sizeof( xs ) = 24
于 2012-12-02T18:13:24.893 に答える