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],指向浮点二维数组的指针(说明:我们不能传递数组,我们将指针传递给它的第一个元素,这是一个 4x5 数组,因此float (*)[4][5])。

array[0](作为参数)将是类型float (*)[5],指向浮点数的一维数组的指针(解释:array[0]是一个 4x5 数组,我们不能传递数组,我们将指针传递给它的第一个元素,第一个元素是一个由 5 个元素组成的数组,因此float (*)[5])。

array[0][0](作为参数)将是类型float *,指向浮点数的指针(解释:array[0][0]是一个由 5 个元素组成的数组,我们不能传递数组,我们将指针传递给它的第一个元素,第一个元素是浮点数,因此float *)。

&array[0][0][0](作为参数)将是类型float *,指向浮点数的指针(解释:array[0][0][0]是 a 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[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 回答
0

如前所述,没有区别。

例如,如果您有一个数组

float x[10][10];

您可以使用两种不同的方式在第一个“行”中引用 3-d 项目:

x[1][3]

或者

*(*(x+1) + 3)

于 2012-09-12T09:52:28.583 回答