首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C中与数组相关的函数参数的差异

C中与数组相关的函数参数的差异
EN

Stack Overflow用户
提问于 2012-09-12 17:37:55
回答 6查看 180关注 0票数 0

我已经定义了一个数组:

代码语言:javascript
复制
float array[3][4][5];

那么,有什么区别呢

代码语言:javascript
复制
array, array[0], array[0][0], &array[0][0][0]

是否用作函数参数?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-09-12 18:06:22

需要了解的重要一点是,在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]是一个float,我们传递一个指向它的指针,因此是float *)。

也许,一个更详细的例子:

代码语言:javascript
复制
#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):

代码语言:javascript
复制
&x=0x804a040 x=0x804a040 &x[0]=0x804a040 x[0]=0x804a040 *x=0x804a040 &x[0][0]=0x804a040
票数 3
EN

Stack Overflow用户

发布于 2012-09-12 17:48:50

所有这些都指向相同的位置。

代码语言:javascript
复制
#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;
    }

给了我

代码语言:javascript
复制
    Address : 0x7fff51a2cac0, 
0x7fff51a2cac0, 
0x7fff51a2cac0, 
0x7fff51a2cac0

 Address : 0x7fff51a2cb10, 
0x7fff51a2cad4, 
0x7fff51a2cac4, 
0x7fff51a2cac4

主要的区别在于我们递增地址的时候。

代码语言:javascript
复制
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].
票数 1
EN

Stack Overflow用户

发布于 2012-09-12 17:45:14

在这些情况下,您将传递float[3][4][5]float[4][5]float[5]float*,但在需要时,它们都会退化为float*

请参阅Difference between passing array and array pointer into function in C

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12385267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档