如何在C中传递数组作为参数?
int a,b,c[10];
void Name1(int x, int y, int *z)
{
a = x;
b = y;
c = z;
}
我尝试将其作为参数传递,但它没有构建,如何修复它?
void Name1(int x, int y, int *z);
的声明是否与void Name1(int x, int y, int z[])
相同?编译器会将void Name1(int x, int y, int z[])
视为void Name1(int x, int y, int *z);
吗?
答案 0 :(得分:1)
当您将数组作为参数传递给函数时,它会衰减为指向其第一个元素的指针。
所以,
void Name1(int x, int y, int *z)
会奏效 但是阵列不可分配:
c = z;
不起作用,您需要将每个数组元素从源显式复制到目标。
答案 1 :(得分:0)
执行c = z;
,您将分配一个非l值,这是不允许的。这就像做&c[0] = &z[0];
。
答案 2 :(得分:0)
这里有几个答案,但我认为它们中的任何一个都不够,所以......
基本上你可以复制数组或使用指针,但无论哪种方式,你都需要跟踪长度。
int a,b, *c, len;
void Name1(int x, int y, int *z, int z_len)
{
a = x;
b = y;
c = z;
len = z_len;
}
//usage:
int arr[5];
Name1(1,2,arr /* or &arr[0] ,*/, sizeof(arr )/ sizeof (int));
如果你永远不需要添加项目就足够了......如果你这样做会变得更复杂......
保持长度是很重要的,这样你就可以知道你有多少元素,即使你打算复制它们。
答案 3 :(得分:0)
c=z; is invalid
c指针没有内存来保存z地址。
你可以说:int a,b,*c;
c=(int *)calloc(10,sizeof(int) );
void Name1(int x, int y, int *z)
{
a = x;
b = y;
c = z;
}