c中函数的数组
我将一维数组传递给函数的常规方法如下所示c中函数的数组,c,arrays,pointers,multidimensional-array,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]); } }
#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;
}
#包括
#定义数组大小为5
void函数(int*ptr_数组,int大小)
{
整数指数;
printf(“目标数组内容:”);
对于(index=0;index所有数组都可以隐式转换为与数组类型相同的指针,但不能以相反的方式转换。这就是为什么将数组传递给接受指针或将数组分配给指针的函数是有效的,但不能将指针分配给数组
至于第二个问题,您必须将参数设置为双数组(即类型数组[][]]
)或数组指针(即类型(*array)[]
)。在这种情况下,指向指针的指针将不起作用,因为它是其他对象。所有数组都可以隐式转换为与数组类型相同的指针,但不能以其他方式转换。这就是为什么将数组传递给接受指针或将数组分配给指针的函数会起作用,但不能将指针分配给数组
至于第二个问题,您必须将参数设置为双数组(即类型数组[][]]
)或数组指针(即类型(*array)[]
)。在这种情况下,指向指针的指针将不起作用,因为它是其他对象
在我看来,编译器必须对接受的参数进行转换
在函数中。数组索引如何影响强制转换
除了在某些情况下(根据C11标准,将数组用作sizeof
、\u Alignof
和一元&
运算符的操作数),数组将作为指向其第一个元素的指针进行计算。此外,以下形式是等效的(对于函数参数):
因此,不存在真正的参数“强制转换”;数组隐式转换为指针,并与参数类型匹配
如果传递给函数的是2D数组的基址,那么接受int[]形式的参数的正确类型是什么
以下表格是正确的:
void f(int t[][SIZE]);
void f(int (*t)[SIZE]);
在我看来,编译器必须对接受的参数进行转换
在函数中。数组索引如何影响强制转换
除了在某些情况下(根据C11标准,将数组用作sizeof
、\u Alignof
和一元&
运算符的操作数),数组将作为指向其第一个元素的指针进行计算。此外,以下形式是等效的(对于函数参数):
因此,不存在真正的参数“强制转换”;数组隐式转换为指针,并与参数类型匹配
如果传递给函数的是2D数组的基址,那么接受int[]形式的参数的正确类型是什么
以下表格是正确的:
void f(int t[][SIZE]);
void f(int (*t)[SIZE]);
在函数参数声明的上下文中,ta[]
和ta[N]
与ta*a
同义;a
是指针类型,而不是数组类型,无论您使用的是[]
还是[N]
还是*
6.7.6.3功能声明器(包括原型)
…
7将参数声明为“类型数组”应调整为“指向
类型“”,其中类型限定符(如有)为
数组类型派生。如果关键字static
也出现在
数组类型派生,然后为每个函数调用
实际参数应提供对数组第一个元素的访问,该元素至少具有相同的数量
尺寸表达式指定的元素。
为什么会这样?这就是为什么:
6.3.2.1左值、数组和函数指示符
…
3除非它是sizeof
运算符、\u
运算符或
一元&
运算符,或是用于初始化数组的字符串文字,一个具有
类型“”的数组“”已转换为类型为“”指向类型“”的指针的表达式
指向数组对象的初始元素,并且不是左值。如果数组对象
注册
存储类,行为未定义。
在调用函数
时,表达式数组
的类型为“5元素数组的int
”;根据6.3.2.1/3中的规则,它被转换(“衰减”)为“指针指向int
”类型的表达式,其值是第一个元素的地址(数组[0]
);此指针值是传递给函数的值
如果array
已声明为int array[5][5]
,则表达式array
将从“int
的5元素数组的5元素数组”转换为“int
的5元素数组的指针”,或int(*)[5]
,函数声明如下
void function(int (*array)[5], int size)
也可以写成
void function(int array[][5], int size)
或
注意,在这种情况下,外部维度的大小不是可选的;必须指定它,以便编译器知道所指向类型的大小。在函数参数声明的上下文中,
ta[]
和ta[N]
与T*a
同义;a
是指针类型,而不是数组类型,无论您是使用[]
还是[N]
还是*
6.7.6.3功能声明器(包括原型)
…7将参数声明为“类型数组”应调整为“指向 类型“”,其中类型限定符(如有)为 数组类型派生。如果关键字
s
void function(int array[5][5], int size)