0

配列を定義しました:

float array[3][4][5];

では、違いは何ですか

array, array[0], array[0][0], &array[0][0][0]

関数の引数として使用されますか?

4

6 に答える 6

3

学ぶべき重要なことは、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
于 2012-09-12T10:06:22.300 に答える
1

すべて同じ場所へのポイントです。

#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].
于 2012-09-12T09:48:49.990 に答える
0

言ったように、違いはありません。

たとえば、配列がある場合

float x[10][10];

2つの異なる方法を使用して、最初の「行」で3Dアイテムを参照できます。

x[1][3]

また

*(*(x + 1)+ 3)

于 2012-09-12T09:52:28.583 に答える
0

、、、、またはそのような場合を渡しますがfloat[3][4][5]、必要に応じてすべてが縮退します。float[4][5]float[5]float*float*

Cの関数への配列と配列ポインタの受け渡しの違いを参照してください。

于 2012-09-12T09:45:14.167 に答える
0

配列へのポインタしか渡せないため、関数に渡す場合でも違いはありません。ただし、関数では、配列のサイズを引数として取り、適切なメンバーを自分で計算できます。

于 2012-09-12T09:46:37.367 に答える
0

アクセシビリティの観点から、

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

于 2012-09-12T09:51:33.993 に答える