数组到c中的函数

时间:2012-10-17 15:56:02

标签: c arrays pointers multidimensional-array

我用来将一维数组传递给函数的常规方法如下:

#include <stdio.h>
#define ARRAY_SIZE 5 

void function(int *ptr_array, int size) 
{
  int index;
  printf("Destination array contents: ");
  for(index=0;index<size;index++)
  {
     printf("%d ",ptr_array[index]);
  }
}

int main()
{
   int array[ARRAY_SIZE]={1,2,3,4,5};
   function(array,ARRAY_SIZE);
   printf("\n");
   return 0;
}

我确实意识到接受参数的函数也可以跟随void function(int ptr_array[],int size)(或)void function(int ptr_array[5],int size)。在这种情况下,传递的争论是int *,但在int []中收到}。所以问题是

  • 我认为编译器必须对函数中的接受参数进行强制转换。数组索引如何影响强制转换?
  • 如果它是传递给函数的2D数组的基地址,那么接受int[][]形式的参数的正确类型是什么

3 个答案:

答案 0 :(得分:2)

在函数参数声明的上下文中,T a[]T a[N]T *a同义;无论您使用a还是[]还是[N]*都是指针类型,而不是数组类型。

Chapter and verse:

6.7.6.3函数声明符(包括原型)

...
7参数声明为'' type ''的数组应调整为''限定指针 type '',其中类型限定符(如果有)是在[]内指定的类型 数组类型推导。如果关键字static也出现在[]内 数组类型派生,然后对每个函数调用,对应的值 实际参数应提供至少与数组一样多的数组的第一个元素的访问权限 由size表达式指定的元素。

为什么会这样?这就是原因:

6.3.2.1左值,数组和函数指示符

...
3除非它是sizeof运算符,_Alignof运算符或运算符的操作数 一元&运算符,或者是用于初始化数组的字符串文字,一个包含的表达式 类型'' type ''的数组被转换为类型为''指向 type ''指针的表达式 到数组对象的初始元素,而不是左值。如果数组对象有 register存储类,行为未定义。

在对function的调用中,表达式 array的类型为“{element}}的5元素数组”;根据6.3.2.1/3中的规则,它被转换(“衰变”)为“指向int的指针”类型的表达式,其值是第一个元素的地址(int) ;此指针值是传递给&array[0]的值。

如果function已声明为array,那么表达式int array[5][5]将从“{元素{5}的5元素数组的5元素数组”转换为“指向array“或int的5元素数组的指针,您的函数声明看起来像

int

也可以写成

int (*)[5]

void function(int (*array)[5], int size)

请注意,在这种情况下,外部维度的大小不是可选的;必须指定它,以便编译器知道所指向类型的大小。

答案 1 :(得分:1)

所有数组都可以隐式转换为与数组相同类型的指针,但不是相反。这就是为什么它将数组传递给接受指针或将数组赋给指针的函数,但是你不能指定一个指向数组的指针。

至于你的第二个问题,要么必须将参数作为双数组(即type array[][])或指向数组的指针(即type (*array)[])。在这种情况下,指向指针的指针将工作,因为它是其他东西。

答案 2 :(得分:1)

  

在我看来,编译器必须对接受的参数进行强制转换   在函数中。数组索引如何影响转换?

除了在某些情况下(根据C11标准,用作sizeof_Alignof和一元&运算符的操作数),数组被计算为指向其第一个元素的指针。此外,以下形式是等效的(在函数参数的情况下):

void function(int ptr_array[], int size);
void function(int *ptr_array, int size);

因此,没有真正的“演员”的论点;数组被隐式转换为指针,并与参数类型匹配。

  

如果是传递给函数的2D数组的基地址,接受int [] []形式的参数的正确类型是什么?

以下表格是正确的:

void f(int t[][SIZE]);
void f(int (*t)[SIZE]);