C 言语关于布局体做参数传送

发布日期:2019-07-23 19:56:41 阅读数: 598次 来源: 作者:

起首布局体做函数参数有三种传送体例:

一是传送布局体变量,这是值传送,二是传送布局体指针,这是地址传送,三是传送布局体成员,当然这也分为值传送和地址传送。

以传援用挪用体例传送布局比用传值体例传送布局效率高。以传值体例传送布局需要对整个布局做一份拷贝。

下面看一个列子,student布局体中包含该学生的各类消息,我们在change函数中对其进行部门点窜,再在主函数中输出其成果

1.下面传送布局体变量

#include<stdio.h>
#include<string.h>
#define format "%d\n%s\n%f\n%f\n%f\n"
struct student
{
    int num;
    char name[20];
    float score[3];
};
void change( struct student stu );
int main()
{
    
    struct student stu;
    stu.num = 12345;
    strcpy(stu.name, "Tom");
    stu.score[0] = 67.5;
    stu.score[1] = 89;
    stu.score[2] = 78.6;
    change(stu);
    printf(format, stu.num, stu.name, stu.score[0],亚博 stu.score[1],stu.score[2]);
    printf("\n");
    return 0;
}
 
void change(struct student stu)
{
    stu.score[0] = 100;
    strcpy(stu.name, "jerry");
}

能够看到最终输出的值并未改变。。。

2.地址传送

#include<stdio.h>
#define format "%d\n%s\n%f\n%f\n%f\n"
struct student
{
    int num;
    char name[20];
    float score[3];
};
void change( struct student* stu );
int main()
{
    
    struct student stu;
    stu.num = 12345;
    strcpy(stu.name, "Tom");
    stu.score[0] = 67.5;
    stu.score[1] = 89;
    stu.score[2] = 78.6;
    change(&stu);
    printf(format, stu.num, stu.name, stu.score[0], stu.score[1],stu.score[2]);
    printf("\n");
    return 0;
}
 
void change(struct student* p)
{
    p->score[0] = 100;
    strcpy(p->name, "jerry");
}

能够看到,通过地址传送点窜告终构体内的数据

用&stu做实参,&stu是布局体变量stu的地址。在挪用函数时将该地址传送给形参p(p是指针变量)。如许p就指向stu。

在change函数中改变布局体内成员的值,在主函数中就输出了改变后的值

3.布局体成员的地址传送和值传送

这个雷同于单一变量的传送,这里也没需要说了,当然是地址传送才能点窜。

把一个完整的布局体变量作为参数传送,要将全数成员值一个一个传送,费时间又费空间,开销大。若是布局体类型中的成员良多,或有一些成员是数组,则法式运转效率会大大降低。在这种环境下,用指针做函数参数比力好,能提高运转效率。

本文由亚博手机app编辑整理亚博手机app