首页 > 编程笔记 > C语言笔记 阅读:2

C语言结构体作为函数参数(非常详细,附带实例)

C语言中的函数是有参数的,可以将结构体变量的值作为函数的参数。

使用结构体作为函数的参数有 3 种形式:
  1. 使用结构体变量作为函数参数;
  2. 使用指向结构体变量的指针作为函数参数;
  3. 使用结构体变量的成员作为函数参数。

使用结构体变量作为函数参数

使用结构体变量作为函数的实参时,采取的是“值传递”,它会将结构体变量所占内存单元的内容全部按顺序传递给形参,形参必须是同类型的结构体变量。

例如:
void Display(struct telephone tel); //使用结构体变量作为函数的参数
在形参的位置使用结构体变量,但是函数调用期间,形参也要占用内存单元。这种传递方式在空间和时间上开销都比较大。

另外,根据函数参数传值方式可知,如果在函数内部修改了变量中成员的值,则改变的值不会返回到主调函数中。

【实例】声明一个简单的结构体类型表示学生成绩,编写一个函数,将该结构体变量作为函数的参数。具体代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

struct Student   /*定义学生结构体*/
{
    char cName[20];    /*姓名*/
    float fScore[3];    /*分数*/
}student={"SuYuQun",98.5f,89.0,93.5f};        /*定义变量*/

void Display(struct Student stu)  /*形参为结构体变量*/
{
    printf("-----Information-----\n");    /*提示信息*/
    printf("Name: %s\n",stu.cName);       /*引用结构成员*/
    printf("Chinese: %.2f\n",stu.fScore[0]);
    printf("Math: %.2f\n",stu.fScore[1]);
    printf("English: %.2f\n",stu.fScore[2]);
    /*计算平均分数*/
    printf("Average score:%.2f\n",(stu.fScore[0]+stu.fScore[1]+stu.fScore[2])/3);
}

int main()
{
    Display(student);     /*调用函数,将结构体变量作为实参进行传递*/
    return 0;
}
运行程序,结果为:

-----Information-----
Name: SuYuQun
Chinese: 98.50
Math: 89.00
English: 93.50
Average score:93.67

从该实例代码和运行结果可以看出以下内容:
1) 在程序中声明了一个简单的结构体表示学生的分数信息,在这个结构体中定义了一个字符数组表示名称,还定义了一个浮点型数组表示 3 个学科的分数。

2) 在声明结构的最后同时定义变量,并进行初始化。之后定义一个名为 Display 的函数,用结构体变量作为函数的形参。

3) 在函数体中,使用参数 stu 引用结构体中的成员,输出学生的姓名和 3 个学科的分数,并在最后通过表达式计算出平均分数。在主函数 main() 中,使用 student 结构体变量作为参数,调用 Display() 函数。

使用指向结构体变量的指针作为函数参数

在使用结构体变量作为函数参数时,在传值的过程中空间和时间的开销比较大,有一种更好的传递方式,就是使用结构体变量的指针作为函数参数进行传递。

在传递结构体变量的指针时,只是将结构体变量的首地址进行传递,并没有将变量的副本进行传递。例如,声明一个传递结构体变量的指针的函数,代码如下:
void Display(struct Student *stu);
这样使用形参 stu 指针就可以引用结构体变量中的成员了。这里需要注意的是,因为传递的是变量的地址,如果在函数中改变成员中的数据,那么返回主调用函数时变量会发生改变。

【实例】因失误某位同学的英语成绩被录错,编写程序修改英语成绩。本实例使用结构体变量的指针作为函数的参数,并且在函数中改动结构体成员的数据,最后对其进行输出。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

struct Student        /*定义学生结构体*/
{
    char cName[20];    /*姓名*/
    float fScore[3];    /*分数*/
}student={"SuYuQun",98.5f,89.0,93.5f};        /*定义变量*/

void Display(struct Student* stu)             /*形参为结构体变量的指针*/
{
    printf("-----Information-----\n");        /*提示信息*/
    printf("Name: %s\n",stu->cName);  /*使用指针引用结构体变量中的成员*/
    printf("English: %.2f\n",stu->fScore[2]);    /*输出英语的分数*/
    stu->fScore[2]=90.0f;                 /*更改成员变量的值*/
}

int main()
{
    struct Student* pStruct=&student;      /*定义结构体变量指针*/
    Display(pStruct);      /*调用函数,将结构体变量作为实参进行传递*/
    printf("Changed English: %.2f\n",pStruct->fScore[2]);
    return 0;
}
运行程序,结果为:

-----Information-----
Name: SuYuQun
English: 93.50
Changed English: 90.00

从该实例代码和运行结果可以看出以下内容:
1) 函数的参数是结构体变量的指针,因此在函数体中要通过使用“->”引用成员的数据。为了简化操作,只将英语成绩进行输出,并且在最后更改成员的数据。

2) 在主函数 main() 中,先定义结构体变量指针,并将结构体变量的地址传递给指针,将指针作为函数的参数进行传递。函数调用完后,再输出变量中的成员数据。

3) 通过输出结果可以看到,在函数中通过指针改变成员的值时,会改变返回主调用函数中的值。

注意,在程序中为了直观地看出函数传递的参数是结构体变量的指针,定义了一个指针变量指向结构体。实际上可以直接传递结构体变量的地址作为函数的参数,如“Display(&student);”。

使用结构体变量的成员作为函数参数

使用这种方式为函数传递参数与将普通的变量作为实参效果是一样的,是以传值的方式传递,例如:
Display(student.fScore[0]);
注意,传值时实参要与形参类型一致。

相关文章