配列を定義しました:
float array[3][4][5];
では、違いは何ですか
array, array[0], array[0][0], &array[0][0][0]
関数の引数として使用されますか?
学ぶべき重要なことは、Cでは、配列全体がパラメーターとして渡されないということです。代わりに、配列の最初の要素へのポインターが渡されます。
だから、定義を考えるとfloat array[3][4][5];
...
array
(パラメーターとして)タイプfloat (*)[4][5]
は、floatの2次元配列へのポインターです(説明:配列を渡すことはできません。ポインターを最初の要素である4x5配列に渡しますfloat (*)[4][5]
)。
array[0]
(パラメーターとして)タイプfloat (*)[5]
は、floatの1次元配列へのポインターです(説明:array[0]
は4x5配列であり、配列を渡すことはできません。ポインターをその最初の要素である最初の要素に渡します。 5つの要素の配列であるため、float (*)[5]
)。
array[0][0]
(パラメーターとして)タイプfloat *
は、floatへのポインターです(説明:array[0][0]
は5つの要素の配列であり、配列を渡すことはできません。ポインターをその最初の要素に渡します。最初の要素はfloatです。 、したがってfloat *
)。
&array[0][0][0]
(パラメーターとして)はfloat *
、floatへのポインターであるタイプになります(説明:array[0][0][0]
は、float
であり、ポインターを渡しますfloat *
)。
おそらく、より複雑な例:
#include <stdio.h>
int x[3][5] =
{
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 10 },
{ 11, 12, 13, 14, 15 }
};
int (*pArr35)[3][5] = &x;
// &x is a pointer to an array of 3 arrays of 5 ints.
int (*pArr5a)[5] = x;
// x decays from an array of arrays of 5 ints to
// a pointer to an array of 5 ints,
// x is a pointer to an array of 5 ints.
int (*pArr5b)[5] = &x[0];
// &x[0] is a pointer to 0th element of x,
// x[0] is an array of 5 ints,
// &x[0] is a pointer to an array of 5 ints.
int *pInta = x[0];
// x[0] is 0th element of x,
// x[0] is an array of 5 ints,
// x[0] decays from an array of 5 ints to
// a pointer to an int.
int *pIntb = *x;
// x decays from an array of arrays of 5 ints to
// a pointer to an array of 5 ints,
// x is a pointer to an array of 5 ints,
// *x is an array of 5 ints,
// *x decays from an array of 5 ints to
// a pointer to an int.
int *pIntc = &x[0][0];
// x[0][0] is 0th element of x[0],
// where x[0] is an array of 5 ints,
// x[0][0] is an int,
// &x[0][0] is a pointer to an int.
int main(void)
{
printf("&x=%p x=%p &x[0]=%p x[0]=%p *x=%p &x[0][0]=%p\n",
pArr35, pArr5a, pArr5b, pInta, pIntb, pIntc);
return 0;
}
出力(ideone):
&x=0x804a040 x=0x804a040 &x[0]=0x804a040 x[0]=0x804a040 *x=0x804a040 &x[0][0]=0x804a040
すべて同じ場所へのポイントです。
#include <stdio.h>
int main()
{
float array[3][4][5];
printf("\n Address : %p, \n%p, \n%p, \n%p\n",array, array[0], array[0][0], &array[0][0][0]);
printf("\n Address : %p, \n%p, \n%p, \n%p\n",array+1, array[0]+1, array[0][0]+1, &array[0][0][0] + 1);
return 0;
}
私にくれた
Address : 0x7fff51a2cac0,
0x7fff51a2cac0,
0x7fff51a2cac0,
0x7fff51a2cac0
Address : 0x7fff51a2cb10,
0x7fff51a2cad4,
0x7fff51a2cac4,
0x7fff51a2cac4
主な違いは、アドレスをインクリメントするときに発生します。
array + 1 gives array[1][0][0]
array[0] + 1 gives array[0][1][0]
then both array[0][0]+1 and &array[0][0][0] + 1 will points to array[0][0][1].
言ったように、違いはありません。
たとえば、配列がある場合
float x[10][10];
2つの異なる方法を使用して、最初の「行」で3Dアイテムを参照できます。
x[1][3]
また
*(*(x + 1)+ 3)
、、、、またはそのような場合を渡しますがfloat[3][4][5]
、必要に応じてすべてが縮退します。float[4][5]
float[5]
float*
float*
Cの関数への配列と配列ポインタの受け渡しの違いを参照してください。
配列へのポインタしか渡せないため、関数に渡す場合でも違いはありません。ただし、関数では、配列のサイズを引数として取り、適切なメンバーを自分で計算できます。
アクセシビリティの観点から、
array = gives 3 dimensional array
array[0] = gives 2 dimensional array which is in array's 0th index
array[0][0] = gives 1 dimensional array which is in array's (0,0)th index
&array[0][0][0] = gives float *
あなたが言うなら、それは最初の場所にある変数array[0][0][0]
だけを与えますfloat