2017-01-13 12 views
0

私はかなり簡単な質問があります(私は願っています)。 C INC:* array [x]のサイズ?

、例えばint array[10][10];

としてdelcaredアレイの大きさは、私は10個の整数を格納するための10個のスポットを有するものとして理解します。しかし、int *array[10];と宣言された配列のサイズは? *arrayには10個の要素があることがわかりますが、arrayにはいくつの要素がありますか?

これは私の理解の中で私が本当にクリアしたいと思う穴です。助けてくれてありがとう!

+2

これは単純に '10'ポインタの配列です。より具体的には、10の 'int *'の配列。 – RoadRunner

+2

"' * array'には10個の要素があることを知っています " - 実際、' * array'はポインタであり、要素ではない配列ではありません。 – interjay

+0

'int(* array)[10]'は10個のint型の配列へのポインタですので、 '* array'は10個の' int'型の配列です。 –

答えて

1

あなたは部品でそれを割るC. スタートで宣言を理解する必要があります。

int array[10][10]; 

arrayは変数の名前であり、一部[10]は、それがint型の10の配列の配列であることを意味し、各配列は10個の要素を保持する(第2の[10])。今

int * array[10]; 

arrayは、変数の名前であり、一部[10]は、タイプint *(前として整数ポインタではない整数)の10個の要素のアレイであることを意味します。

大文字小文字の場合のサイズは、10個の整数= 100個の整数に必要なスペースの配列のサイズの10倍になります。

2番目のケースでは、整数へのポインタを10個保持するサイズになります。

あなたの混乱は、Cが同じ方法で両方の宣言の要素にアクセスできるという事実から来ている可能性があります。私。以下は二番目の配列の5番目の整数取得する:

int b = array[2][5]; 

をしかし、最初の宣言で、コンパイラは、すべての100個の整数(編成を保持するために連続した領域を割り当てるため、違いは、AS、割当方法Cに従って、実質的に残ります第10の整数の10個の配列)は、それぞれが10個の整数の配列の位置を指す10個のポインタの配列のみが割り当てられる。そして、10個の配列は、に割り当てられず、ポインタも初期化されません。

この場合、intの10個の配列を割り当てて、それぞれのアドレスをポインタの配列に割り当てるのはプログラマの責任です。

明確にするもう一つの点は、ポインタの配列の場合、2番目の次元は定義されていないということです。すなわち、intの各配列は1,10,1000またはどんな要素でも。

+0

偉大な答えは、ありがとう。したがって、 'int * array [10];のような配列は2次元として使用できませんか?例えば、 'array [0] [0]'には要素がありません。編集:私はあなたがそれに対処したことを知っている参照してください、 –

+0

"* ... 10個の整数の配列の場所を指している*。これらのポインタは、配列が初期化されていないため、どこも指していません。そして、たとえどのような場合でも、int * array [10]の各要素がint型を指していても、初期化されていても、それ以上のものはありません。 – alk

+0

@alkありがとう。私はタイプミスを修正し、いくつかの説明を追加しました。残念なことに、言語の主題は常に非常に大きく、あなたが加える説明が何か間違っている、不明瞭な文、不足していること、悪いものなどが常に存在する。答えごとに本を書くべきです... –

2

int *array[10]; 10のint *の配列であるので、要素数がint *array[10];ため、array可変のTYタイプは、整数へのポインタ型の10個の素子のアレイint * [10]であり、詳述すると10

あります。

アレイのサイズは10 * sizeof pointer-to-integer-in-your-platformです。

1

配列にはいくつの要素がありますか?

int *array[10]; 

array intへのポインタ10、int* array[10]と同一の配列である - そうarrayは、10個の要素(ポインタである各要素)を有しています。