# C 结构与函数

> 原文： [https://www.programiz.com/c-programming/c-structure-function](https://www.programiz.com/c-programming/c-structure-function)

#### 在本教程中，您将学习将结构变量作为参数传递给函数。 您将学习借助示例从函数返回`struct`的方法。

与内置类型的变量类似，您也可以将结构变量传递给函数。

* * *

## 将结构传递给函数

我们建议您在学习如何将结构传递给函数之前先学习这些教程。

*   [C 结构](/c-programming/c-structures)
*   [C 函数](/c-programming/c-functions)
*   [用户定义的函数](/c-programming/c-user-defined-functions)

这是将结构传递给函数的方法

```c
#include <stdio.h>
struct student {
   char name[50];
   int age;
};

// function prototype
void display(struct student s);

int main() {
   struct student s1;

   printf("Enter name: ");

   // read string input from the user until \n is entered
   // \n is discarded
   scanf("%[^\n]%*c", s1.name);

   printf("Enter age: ");
   scanf("%d", &s1.age);

   display(s1); // passing struct as an argument

   return 0;
}

void display(struct student s) {
   printf("\nDisplaying information\n");
   printf("Name: %s", s.name);
   printf("\nAge: %d", s.age);
}
```

**输出**

```c
Enter name: Bond
Enter age: 13

Displaying information
Name: Bond
Age: 13 
```

在此，创建类型为`struct student`的结构变量`s1`。 使用`display(s1);`语句将该变量传递到`display()`函数。

* * *

## 从函数返回结构

这是从函数返回结构的方法：

```c
#include <stdio.h>
struct student
{
    char name[50];
    int age;
};

// function prototype
struct student getInformation();

int main()
{
    struct student s;

    s = getInformation();

    printf("\nDisplaying information\n");
    printf("Name: %s", s.name);
    printf("\nRoll: %d", s.age);

    return 0;
}
struct student getInformation() 
{
  struct student s1;

  printf("Enter name: ");
  scanf ("%[^\n]%*c", s1.name);

  printf("Enter age: ");
  scanf("%d", &s1.age);

  return s1;
} 
```

在此，使用`s = getInformation();`语句调用`getInformation()`函数。 该函数返回`struct student`类型的结构。 返回的结构通过`main()`函数显示。

注意，`getInformation()`的返回类型也是`struct student`。

* * *

## 按引用传递结构

您还可以按引用传递结构（就像您按引用传递内置类型的变量一样）。 我们建议您在继续之前阅读[引用传递](/c-programming/c-pointer-functions)的文档。

在按引用传递期间，结构变量的内存地址将传递给函数。

```c
#include <stdio.h>
typedef struct Complex
{
    float real;
    float imag;
} complex;

void addNumbers(complex c1, complex c2, complex *result); 

int main()
{
    complex c1, c2, result;

    printf("For first number,\n");
    printf("Enter real part: ");
    scanf("%f", &c1.real);
    printf("Enter imaginary part: ");
    scanf("%f", &c1.imag);

    printf("For second number, \n");
    printf("Enter real part: ");
    scanf("%f", &c2.real);
    printf("Enter imaginary part: ");
    scanf("%f", &c2.imag);

    addNumbers(c1, c2, &result); 
    printf("\nresult.real = %.1f\n", result.real);
    printf("result.imag = %.1f", result.imag);

    return 0;
}
void addNumbers(complex c1, complex c2, complex *result) 
{
     result->real = c1.real + c2.real;
     result->imag = c1.imag + c2.imag; 
} 
```

**输出**

```c
For first number,
Enter real part:  1.1
Enter imaginary part:  -2.4
For second number, 
Enter real part:  3.4
Enter imaginary part:  -3.2

result.real = 4.5
result.imag = -5.6 
```

在上述程序中，三个结构变量`c1`，`c2`和`result`的地址传递给`addNumbers()`函数。 此处，`result`通过引用传递。

当`addNumbers()`内的`result`变量被更改时，`main()`函数内的`result`变量也相应地被更改。