1

したがって、この配列は次のようなヘッダーファイルにあります。

// header.h
static const unsigned int array1[]={0x00,0x01,0x02,0x03};

と:

// file.c
main()
{
     unsigned int *ptrToArray;

     ptrArray = &array1[0];
 }

私が間違っている場合は私を訂正してください。私は仮定します:配列要素のバイト数を見つけるためにsizeof(array1)、同等のものの代わりに、sizeof(*ptrArray)そうですか?

そして、配列の要素にアクセスするには、の代わりにarray[i]、次のようになります。

  • *(ptrArray)最初の要素については、
  • *(ptrArray+1)2番目の要素についてはそうですか?
4

4 に答える 4

4

のタイプ*ptrToArrayint、したがってsizeof(*ptrToArray)、と同じsizeof(int)です。したがって、の要素数については何もわかりませんarray1

書くこと*(ptrArray+1)などはできますが、書くだけでいいのptrToArray[1]です!

于 2012-07-17T18:16:41.367 に答える
2

ポインターは配列ではなく、配列はポインターではありません。配列は便利なときにポインタに減衰する可能性がありますが、それでも完全な型です。

したがって、そのポインタがたまたま配列の最初の要素を指している場合でも、の型は*someIntPointer配列intではなくです。 sizeof(someArray)型が実際には配列であることがわかっているため、期待どおりに機能します。

于 2012-07-17T18:20:38.117 に答える
0

sizeof ポインタに対して同じように動作することはありません。例では、データ型のサイズがわかります:unsigned int

また、ポインタ演算を使用して要素を参照することもptrArrayできますが、標準の配列逆参照を使用することもできます:、、ptrArray[0]...。ptrArrray[1]ほとんどの場合、そうすることをお勧めします。

于 2012-07-17T18:18:50.707 に答える
-2

Sizeofは、通常のポインター型のポインターのサイズを返します。逆参照されたポインター型のsizeofを使用すると、要素のサイズ(つまり、sizeof(unsigned int))が取得されます。配列内の要素の数を自分で追跡するか、配列宣言でsizeofを使用する必要があります。

アクセスに関しては、そのようにすることもできますが、通常の配列の場合と同じように角かっこ表記を使用できます。

配列は特別なクラスのポインタです。コンパイラは、配列を配列として扱うタイミングとポインタとして扱うタイミングを認識しています。これにより、配列の大きさを知ることができますが、配列を期待する関数に配列を渡すことができます(これを行うと、次のようになります。最初の要素へのポインタ)。ただし、同じことは逆には機能しません。コンパイラは、ポインタとして宣言されたポインタを配列として扱うことはありません。

ちなみに、[]ポインタ演算に単純化するだけです。intにポインタを追加できますが、ポインタにintを追加することもできます。したがって、あなたは次のような奇妙なことをすることができます(しかしおそらくすべきではありません)1[ptrArray]

于 2012-07-17T18:17:58.210 に答える