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

时间:2017-11-11 00:32:51

标签: 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)\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;
 }

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

3 个答案:

答案 0 :(得分:2)

您读错了语法。它不是*function它是function返回double *又是指向双精度的指针。

在C中,当您需要动态分配的数组时,可以使用指针执行此操作。此外,C不允许直接从函数返回数组,因此您必须返回指向其内存的指针。 (注意局部变量将被处理掉)

答案 1 :(得分:1)

回答您的具体问题:您无法返回&#34; true&#34; C中的数组。但是,您可以返回指向数组开头的指针。

说实话,你所面对/学习的代码不是最好的。我能理解vec()是否返回了一个malloc指针,因为它不知道输入数组有多大。但是[部分]赠送是vec()没有接收到描述数组中有多少元素的参数(数组参数本身不能告诉你这个)。 (我说部分因为数组可能已经通过例如0值自我终止,就像使用C风格的字符串一样)。

但是vec()的实现表明它需要3个元素的数组,因此返回malloc指针是不必要的。对于vec而言,传入第三个参数(数组)以接收结果会快得多(并且更安全)。这样就没有动态内存分配或释放,也没有机会忘记免费。

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

struct DoubleArray3
{
   double values[ 3 ];
}

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

答案 2 :(得分:0)

功能定义为

Return_type Name_of_function(argument_list)

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

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