刚开始学习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?
答案 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 *,因为它是从函数返回的变量)