2

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

#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)(or) void function(int ptr_array[5],int size)。在这种情况下,传递的参数是 aint *但收到 in int []。所以问题是

  • 在我看来,编译器必须对函数中接受的参数进行强制转换。数组索引如何影响强制转换?
  • 如果传递给函数的是二维数组的基地址,那么接受int[][]表单 参数的正确类型是什么
4

3 回答 3

2

在函数参数声明的上下文中,T a[]和是;T a[N]的同义词 是指针类型,不是数组类型,不管你用or还是. T *aa[][N]*

章节和诗句:

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

...
7 将参数声明为“类型数组”应调整为“指向 类型的限定指针”,其中类型限定符(如果有)是在数组类型派生的[and中指定的那些。]如果关键字static也出现在数组类型派生的[and]中,那么对于函数的每次调用,对应的实际参数的值应提供对数组的第一个元素的访问,该数组的元素至少与大小指定的一样多表达。

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

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

...
3 除非它是运算sizeof符、运算符_Alignof或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为 ''array of type '' 的表达式将转换为表达式类型 ''pointer to type '' 指向数组对象的初始元素并且不是左值。如果数组对象具有 register存储类,则行为未定义。

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

如果array已声明为int array[5][5],则表达式array将从“5 元素数组的 5 元素数组int”转换为“指向 5 元素数组的指针int”,或者int (*)[5],您的函数声明将如下所示

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

也可以写成

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

或者

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

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

于 2012-10-17T16:17:16.690 回答
1

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

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

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

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

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

以下表格是正确的:

void f(int t[][SIZE]);
void f(int (*t)[SIZE]);
于 2012-10-17T16:01:56.610 回答
1

所有数组都可以隐式转换为与数组相同类型的指针,但反之则不行。这就是为什么可以将数组传递给接受指针或将数组分配给指针的函数,但不能将指针分配给数组。

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

于 2012-10-17T16:00:01.440 回答