在C中使用数组作为参数的函数

在C中使用数组作为参数的函数,c,arrays,function,pointers,C,Arrays,Function,Pointers,刚开始学习C语言中的指针,我面临以下代码: #include <stddef.h> #include <stdlib.h> double *vec( double a[], double b[]); int main(){ double v1[3]={1.0,1.0,1.0}; double v2[3]={1.0,-1.0,1.0}; double *v3 = NULL; v3 = vec(v1,v2); printf("v1 X v2 = (%f, %f, %f)\

刚开始学习C语言中的指针,我面临以下代码:

#include <stddef.h>
#include <stdlib.h>

double *vec( double a[], double b[]);
int main(){
double v1[3]={1.0,1.0,1.0};
double v2[3]={1.0,-1.0,1.0};
double *v3 = NULL;
v3 = vec(v1,v2);

printf("v1 X v2 = (%f, %f, %f)\n",v3[0],v3[1],v3[2]);
free( v3);
return 0;
}
double *vec( double a[], double b[]){

    double *c=NULL;
    c = (double *)malloc(3*sizeof( double ));
    c[0]=  a[1]*b[2]-a[2]*b[1];
    c[1]=-(a[0]*b[2]-a[2]*b[0]);
    c[2]=  a[0]*b[1]-a[1]*b[0];
    return c;
 }
#包括
#包括
双*vec(双a[],双b[]);
int main(){
双v1[3]={1.0,1.0,1.0};
双v2[3]={1.0,-1.0,1.0};
double*v3=NULL;
v3=vec(v1,v2);
printf(“v1 X v2=(%f,%f,%f)\n”,v3[0],v3[1],v3[2]);
免费(v3);
返回0;
}
双*vec(双a[],双b[]{
double*c=NULL;
c=(双*)malloc(3*sizeof(双));
c[0]=a[1]*b[2]-a[2]*b[1];
c[1]=-(a[0]*b[2]-a[2]*b[0]);
c[2]=a[0]*b[1]-a[1]*b[0];
返回c;
}

这里的问题是,在声明函数时,作者使用了*函数(参数)而不是函数(参数)。为什么他/她在声明函数vec时使用了指针?

您读错了语法。它不是
*函数
它是一个
函数
返回
double*
又称为指向double的指针


在C语言中,当您需要动态分配数组时,您可以使用指针来实现这一点。另外,C不允许直接从函数返回数组,因此必须返回指向其内存的指针。(当心局部变量会被释放)

你读错了语法。它不是
*函数
它是一个
函数
返回
double*
又称为指向double的指针


在C语言中,当您需要动态分配数组时,您可以使用指针来实现这一点。另外,C不允许直接从函数返回数组,因此必须返回指向其内存的指针。(注意局部变量将被释放)

回答您的特定问题:您不能在C中返回“true”数组。但是,您可以返回指向数组开头的指针


老实说,你所面对/学习的代码不是最好的。我可以理解vec()是否返回malloc'ed指针,因为它不知道输入数组将有多大。但是[partial]的缺点是vec()没有收到描述数组中有多少元素的参数(数组参数本身无法告诉您这一点)。(我之所以说部分,是因为数组可能是通过0值自终止的,就像C样式字符串使用的那样)

但是vec()的实现表明它需要3个元素的数组,因此返回malloc’ed指针有点不必要。对于vec来说,传递第三个参数(数组)来接收结果会更快(更安全)。这样就没有动态内存分配或释放,也没有忘记释放的机会

但是,仍然存在阵列大小不正确的可能性。您可以通过使用一个包含double的3元素数组的结构来解决这个问题,并将该结构(通过指针)传入,例如:

struct DoubleArray3
{
   double values[ 3 ];
}

vec( const DoubleArray3* v1, const DoubleArray3* v2, DoubleArray3* result );

回答您的特定问题:在C中不能返回“true”数组。但是,可以返回指向数组开头的指针


老实说,你所面对/学习的代码不是最好的。我可以理解vec()是否返回malloc'ed指针,因为它不知道输入数组将有多大。但是[partial]的缺点是vec()没有收到描述数组中有多少元素的参数(数组参数本身无法告诉您这一点)。(我之所以说部分,是因为数组可能是通过0值自终止的,就像C样式字符串使用的那样)

但是vec()的实现表明它需要3个元素的数组,因此返回malloc’ed指针有点不必要。对于vec来说,传递第三个参数(数组)来接收结果会更快(更安全)。这样就没有动态内存分配或释放,也没有忘记释放的机会

但是,仍然存在阵列大小不正确的可能性。您可以通过使用一个包含double的3元素数组的结构来解决这个问题,并将该结构(通过指针)传入,例如:

struct DoubleArray3
{
   double values[ 3 ];
}

vec( const DoubleArray3* v1, const DoubleArray3* v2, DoubleArray3* result );

函数定义为

返回函数的类型名称(参数列表)

返回类型可以是int、float、double、int*(表示返回类型为整数指针)、float*、char*等


这里函数的返回类型为double*表示函数将返回double pointer类型的值(C声明为double*,因为它是从函数返回的变量)

函数定义为

返回函数的类型名称(参数列表)

返回类型可以是int、float、double、int*(表示返回类型为整数指针)、float*、char*等


这里函数的返回类型为double*表示函数将返回double pointer类型的值(C声明为double*,因为它是从函数返回的变量)

函数
vec
是一个返回指向
double
的指针的函数。我发现在这样的函数定义中,在星号的两侧添加空格更为清晰:
double*vec(double a[],double b[])有些,特别是C++程序员,似乎喜欢<代码>双*VEC(double a[],双b[]);
强调指针与返回值关联。函数
vec
是一个返回指向
double
指针的函数。我发现在这样的函数定义中,在星号的两侧添加空格更为清晰:
double*vec(double a[],double b[])有些,特别是C++程序员,似乎喜欢<代码>双*VEC(double a[],双b[]);
强调指针与返回值相关联。@DavidBowling你说得对,那句话是一个粗略的概括。我想我已经澄清了一点,但请随意扩展/澄清/指出问题。@DavidBowling你是对的,那句话是一个粗略的概括。我想我已经澄清了一点,但请随意展开/澄清/指出问题。“数组参数本身不能告诉您这一点”——对于