#include <stdio.h>
float orizousa(int n[]);
int main() {
int a[12];
int i;
printf("grapse tous sintelestes kai to apotelesma tis prwtis eksiswsis \n (me seira:1os-2os-3os sintelestis - apotelesma) :");
for(i=0; i<=11; i++) {
scanf(" %d",&a[i]);
}
float g = orizousa(a);
printf(" %f",g);
return 0;
}
float orizousa(int a[]) {
float d,dx1,dx2,dx3,x1,x2,x3;
d = a[0]*a[4]*a[8] + a[1]*a[5]*a[6] + a[2]*a[3]*a[7] - a[2]*a[4]*a[7] - a[1]*a[3]*a[8] - a[0]*a[5]*a[7] ;
dx1 = a[9]*a[4]*a[8] + a[1]*a[5]*a[11] + a[2]*a[10]*a[7] - a[2]*a[4]*a[7] - a[1]*a[10]*a[8] - a[9]*a[5]*a[7] ;
dx2 = a[0]*a[10]*a[8] + a[0]*a[5]*a[6] + a[2]*a[3]*a[11] - a[2]*a[10]*a[11] - a[1]*a[3]*a[8] - a[0]*a[5]*a[11] ;
dx3 = a[0]*a[4]*a[11] + a[1]*a[10]*a[6] + a[9]*a[3]*a[7] - a[9]*a[4]*a[7] - a[1]*a[3]*a[11] - a[0]*a[10]*a[7] ;
return d;
}
在此代码中,在
行中float g = orizousa(a);
为什么我们只放入a
,而不是a[]
?
如何从一个函数返回2个值,例如d
和dx
?
答案 0 :(得分:1)
当涉及到数组的名称时,传递数组的地址,接受它的函数将指向相同的内存地址。它更像是C ++中的引用变量。
你不能一次返回多个值。如果数据类型相似,则可以复制到数组并将数组传回
答案 1 :(得分:1)
浮动g = orizousa(a);
int a []
a是整数类型的数组,其中变量名'a'表示数组a的引用。
函数orizousa采用整数类型的引用参数。这就是为什么你必须传递而不是[]
如果你想返回d和dx,那么只需在你的函数中添加另一个引用。
orizousa(int a[],float pReturn[])
{
....
pReturn[0]=d;
pReturn[1]=dx;
}
答案 2 :(得分:1)
为什么我们只放入'a'而不是[]例如?
当将数组作为参数传递给C中的函数时,我们必须只传递变量名,除非你只想传递数组的一个元素,在这种情况下它将是float g = orizousa(a [2])例如。但函数orizousa接收一个数组,所以你必须传递整个数组。
如何返回2个值?
无法从函数返回C中的2个值。但你可以做的是传递变量作为参考。你可以这样做:
#include <stdio.h>
float orizousa(int n[]);
int main()
{
int a[12];
int i;
printf("grapse tous sintelestes kai to apotelesma tis prwtis eksiswsis \n (me seira:1os-2os-3os sintelestis - apotelesma) :");`enter code here`
for(i=0;i<=11;i++)
{ scanf(" %d",&a[i]);}
float d, dx1, dx2, dx3;
float g=orizousa(a, &d, &dx1, &dx2, &dx3);
printf(" %f",g);
return 0;
}
float orizousa(int a[], float *d, float *dx1, float *dx2, float *dx3)
{
*d=a[0]*a[4]*a[8] + a[1]*a[5]*a[6] + a[2]*a[3]*a[7] - a[2]*a[4]*a[7] - a[1]*a[3]*a[8] - a[0]*a[5]*a[7] ;
*dx1=a[9]*a[4]*a[8] + a[1]*a[5]*a[11] + a[2]*a[10]*a[7] - a[2]*a[4]*a[7] - a[1]*a[10]*a[8] - a[9]*a[5]*a[7] ;
*dx2=a[0]*a[10]*a[8] + a[0]*a[5]*a[6] + a[2]*a[3]*a[11] - a[2]*a[10]*a[11] - a[1]*a[3]*a[8] - a[0]*a[5]*a[11] ;
*dx3=a[0]*a[4]*a[11] + a[1]*a[10]*a[6] + a[9]*a[3]*a[7] - a[9]*a[4]*a[7] - a[1]*a[3]*a[11] - a[0]*a[10]*a[7] ;
}
答案 3 :(得分:1)
数组和指针密切相关。当你写“g = orizousa(a)”时,你传递的函数是数组a的第一个元素的地址的副本。
要从函数返回两个值,您可以传递要更改的两个变量的地址,也可以将它们放入结构中并返回结构。
void foo( int* x, int* y ) {
*x = 1; *y = 2;
}
称为
int xx = 0;
int yy = 0;
foo(&xx,&yy);
或作为结构
typedef struct {
int x;
int y;
} args;
作为参数传入
void foo(args* arg) {
args.x=1;
args.y=2;
}
称为
args arg;
foo(&arg);
或返回
args foo() {
args arg = { 1,2 };
return arg;
}
称为
args arg = foo();
答案 4 :(得分:0)
当您将数组传递给函数orizousa
时,您传递的是数组的地址,而不是实际的副本(在本例中至少为)。在C中,a
实际上存储了数组的第一个元素的地址。所以,您传递的是数组第一个元素的地址。 *a
将打印第一个元素的值。我们无法传递a[]
,因为这是语法错误。
要返回2个值,您可以在main函数中声明一个变量,并将其作为引用变量传递给orizousa
。然后,您可以返回d
并将dx1的值存储在引用变量中。