C语言中的结构体和函数



在C编程中,struct是一种派生数据类型。就像我们可以传递基本数据类型的参数一样,也可以将struct数据类型的变量传递给函数。您还可以使用值传递引用传递方法传递结构体。C语言中的函数也可以返回struct数据类型。

阅读本章以了解以下概念:

  • 如何传递struct类型的元素
  • 如何传递struct变量
  • 如何从函数返回struct
  • 如何返回struct指针

让我们从第一个开始,学习如何传递struct类型的元素。

如何传递结构体元素

派生类型是由一个或多个任何基本类型的元素以及其他派生类型组合而成的。可以按值或按引用将元素传递给函数

示例

在下面的示例中,我们有一个名为“rectangle”的派生类型,它包含两个元素。我们有一个struct变量“r”,其元素为“r.len”和“l.brd”,它们被传递给一个函数。然后,area()函数计算矩形的面积。

#include <stdio.h>

struct rectangle{
   float len, brd;
};

int area(float, float);

int main(){
   
   struct rectangle r;
   r.len = 10.50; r.brd = 20.5;
   area(r.len, r.brd);
   
   return 0;
}

int area(float a, float b){
   
   double area = (double)(a*b);
   printf("Length: %f \nBreadth: %f \nArea: %lf\n", a, b, area);
   
   return 0;
}

输出

运行此代码时,将产生以下输出:

Length: 10.500000 
Breadth: 20.500000 
Area: 215.250000

如何传递结构体变量

让我们修改上面的示例,将struct变量本身(而不是其元素)传递给area()函数。“rectangle”结构体类型还有一个名为“area”的附加元素。

示例

在函数内部,通过点运算符(.)访问struct变量的元素,并计算面积。

#include <stdio.h>

struct rectangle{
   float len, brd;
   double area;
};

int area(struct rectangle);

int main(){
   
   struct rectangle r;
   r.len = 10.50; r.brd = 20.5;
   area(r);
   
   return 0;
}

int area(struct rectangle r){

   r.area = (double)(r.len*r.brd);
   printf("Length: %f \nBreadth: %f \nArea: %lf\n", r.len, r.brd, r.area);

   return 0;
}

输出

运行代码并检查其输出:

Length: 10.500000 
Breadth: 20.500000 
Area: 215.250000

如何从函数返回结构体

我们知道C语言中的函数可以返回任何类型的返回值。在这个例子中,area()函数被定义为返回一个struct变量。

示例

在main()函数内部,长度和宽度的输入被传递给area()函数。在area()函数内部,计算面积并填充struct变量,然后将其返回给main()函数,在main()函数中显示其元素。

#include <stdio.h>

struct rectangle {
   float len, brd;
   double area;
};

struct rectangle area(float x, float y);

int main(){

   struct rectangle r;
   float x, y;

   x = 10.5; y = 20.5;
   r = area(x, y);
   
   printf("Length: %f \n Breadth: %f \n Area: %lf\n", r.len, r.brd, r.area);
   
   return 0;
}

struct rectangle area(float x, float y){

   double area = (double)(x*y);
   struct rectangle r = {x, y, area};
   
   return r;
}

输出

运行此代码时,将产生以下输出:

Length: 10.500000  
Breadth: 20.500000 
Area: 215.250000

如何按引用传递结构体

在C语言中,可以定义函数使其参数按值或按引用传递。引用是指向现有变量的指针

示例

在这个例子中,在main()中声明了一个“rectangle”类型的struct变量,并将它的地址传递给一个名为area()的用户定义函数。

调用area()函数时,它可以使用间接运算符(→)使用变量的元素。它计算结果并将其赋值给area元素“r → area”。

#include <stdio.h>

struct rectangle{
   float len, brd;
   double area;
};

int area(struct rectangle *);

int main(){
   
   struct rectangle r;
   r.len = 10.50; r.brd = 20.5;
   area(&r);
   
   return 0;
}

int area(struct rectangle *r){

   r -> area = (double)(r -> len * r -> brd);
   printf("Length: %f \nBreadth: %f \nArea: %lf\n", r -> len, r -> brd, r -> area);

   return 0;
}

输出

运行代码并检查其输出:

Length: 10.500000 
Breadth: 20.500000 
Area: 215.250000

如何返回结构体指针

让我们重写上面的代码来定义area()函数并返回指向rectangle数据类型struct的指针。

示例

area()函数有两个按值传递的参数。main()函数从用户读取长度和宽度并将它们传递给area()函数,area()函数填充一个struct变量并将它的引用返回给main()函数。

#include <stdio.h>

struct rectangle {
   float len, brd;
   double area;
};

struct rectangle * area(float x, float y);

int main (){
   
   struct rectangle *r;
   float x, y;
   
   x = 10.5; y = 20.5;
   r = area(x, y);
   printf("Length: %f \n Breadth: %f \n Area: %lf\n", r->len, r->brd, r->area);
   
   return 0;
}

struct rectangle * area(float x, float y){

   double area = (double)(x*y);
   static struct rectangle r;
   r.len = x; r.brd = y; r.area = area;

   return &r;
}

输出

运行此代码时,将产生以下输出:

Length: 10.500000 
Breadth: 20.500000 
Area: 215.250000
广告