C函数解释

时间:2014-01-21 05:31:22

标签: c

#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个值,例如ddx

5 个答案:

答案 0 :(得分:1)

当涉及到数组的名称时,传递数组的地址,接受它的函数将指向相同的内存地址。它更像是C ++中的引用变量。

你不能一次返回多个值。如果数据类型相似,则可以复制到数组并将数组传回

答案 1 :(得分:1)

  

浮动g = orizo​​usa(a);

     

int a []

a是整数类型的数组,其中变量名'a'表示数组a的引用。

函数orizo​​usa采用整数类型的引用参数。这就是为什么你必须传递而不是[]

如果你想返回d和dx,那么只需在你的函数中添加另一个引用。

orizousa(int a[],float pReturn[])
{
  ....
  pReturn[0]=d;
  pReturn[1]=dx;

}

答案 2 :(得分:1)

为什么我们只放入'a'而不是[]例如?

当将数组作为参数传递给C中的函数时,我们必须只传递变量名,除非你只想传递数组的一个元素,在这种情况下它将是float g = orizo​​usa(a [2])例如。但函数orizo​​usa接收一个数组,所以你必须传递整个数组。

如何返回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 = orizo​​usa(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的值存储在引用变量中。