C中数组相关函数参数的区别

2024-02-06

我定义了一个数组:

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],一个指向二维浮点数组的指针(说明:我们不能传递该数组,我们将指针传递给它的第一个元素,这是一个 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] is 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;
}

Output (ideone http://ideone.com/NDvca):

&x=0x804a040 x=0x804a040 &x[0]=0x804a040 x[0]=0x804a040 *x=0x804a040 &x[0][0]=0x804a040
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C中数组相关函数参数的区别 的相关文章

随机推荐