C 结构体和函数

本文介绍了如何将结构体作为参数传递给函数,以及如何使用结构体作为函数返回值。

结构体可以作为参数传递给函数,结构体也可以作为函数的返回值。

结构体变量和普通变量的用法类似,可以作为函数参数也可以作为函数返回值。

将结构传递给函数

我们建议您先学习这些教程,然后再学习如何将结构传递给函数。

在学习结构体和函数之前,我们建议您先了解下面的这些主题:

下面的例子展示了如何将参数传递给函数。

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

// 函数原型
void display(struct student s);

int main() {
   struct student s1;

   printf("Enter name: ");

   // 读取用户输入的直到遇到换行
   scanf("%[^\n]%*c", s1.name);

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

   display(s1); // 传递结构体参数

   return 0;
}

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

输出

Enter name: Bond
Enter age: 13

Displaying information
Name: Bond
Age: 13

这里,创建了一个 struct student 类型的结构变量 s1 。使用 display(s1); 语句将结构体变量传递给 display() 函数 。

从函数返回结构

下面的例子展示了如何从函数返回结构。

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

// 函数原型
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 类型的结构体,并赋值给变量 s。最后在 main() 函数中输出函数返回的结构体数据。

请注意,getInformation() 的返回类型也是 struct student 类型。

传递结构体指针给函数

我们还可以传递结构体的指针给函数。请查看指针和函数章节了解更多信息。

将结构体指针传给函数,其实就是将结构体对应的内存地址传递给函数。请看下面的示例。

#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;
}

输出

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, c2result 的传递给了 addNumbers() 函数。这里, *result 传递的是指针。

由于 *result 传递的是指针, 在 addNumbers() 函数内部对 result 修改,也相应的改变了 main() 函数内部的 result 变量。