C语言结构体

本文详细介绍了C语言中的结构体,包括结构体的声明、定义和初始化,typedef的使用,结构体成员的访问,结构体指针的运用以及结构体作为函数参数的传递方式。通过实例展示了如何创建结构体,访问结构体成员,以及结构体在内存中的表示。同时,文章强调了结构体传参时选择指针传递以避免大结构体带来的性能损失。
摘要由CSDN通过智能技术生成

 

本期内容介绍:

什么是结构体,结构体的声明、定义和初始化,如何使用typedef,结构体成员的访问、结构体指针和结构体传参方式。

一、什么是结构体?

        结构体是C语言中一种重要的数据类型,该数据类型由一组称为成员(或称为域,或称为元素)的不同数据组成,其中每个成员可以具有不同的类型。结构体通常用来表示类型不同但是又相关的若干数据。

二、结构体的声明、定义和初始化

1、结构体的声明

struct    tag
{
        member-list;
}variable-list;

例如:我们写一个有关学时信息的结构体声明

struct student
{
    long id;//学号
    char name[20];//姓名
    int age;//年龄
    char sex[10];//性别
}stu;//分号不能丢

struct student就是一个结构体类型,可能有人会不理解为什么不是单独struct,我的理解就是,结构体可以有很多个,但是为了区分,我们在后面加上一个我们自定义的标识符以示区分 。花括号中可以是任意数据类型变量,也可以在结构体中定义结构体类型变量,但是需要注意的是,该结构体声明必须在该结构体声明之前最后的stu就是变量名,这里我们等于声明的同时也定义了,而且这里的stu是一个全局变量,且分号不能丢

2、结构体的定义和初始化

其实我们刚刚在声明的时候就已经定义了结构体,但是该变量是全局变量,在函数中,我们该如何定义结构体变量呢?如何进行初始化呢?

        struct     student     stu1={101,"CSDN",18,"男"};//定义初始化

看到定义和初始化结构体, 大家都应该觉得和定义初始化数组很相似吧。

3、如何使用typedef

相信大家根据typedef就知道是什么意思了吧,type define,类型定义,没错就是将结构体类型定义成一个别名,这样我们每次就只用输入一个单词了,下面我们看看如何使用。

typedef struct student 
{
    long id;//学号
    char name[20];//姓名
    int age;//年龄
    char sex[10];//性别
}STU;

这里的我们将结构体类型重命名为STU,通常重定义名我们用大写以示区分。这样我们就可以用STU代替struct student取定义结构体变量了,例如

int main()
{
    STU s[2]={{111,"zhangsan",20,"male"},{222,"lisi",21,"female"}};
}

4、结构体成员的访问

.结构体变量访问成员

结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。

下面我们用代码来练习如何用点操作符访问成员变量

#include<stdio.h>
struct student{
    long id;
    char name[20];
    int age;
    double score;
}stu[5];
int main()
{
    for(int i=0;i<5;i++)
    {
	    printf("请输入第%d的学生信息:",i+1);
	    scanf("%ld",&stu[i].id);
	    scanf("%s",stu[i].name);
	    scanf("%d%lf",&stu[i].age,,&stu[i].score);
    }
    for(int j=0;j<5;j++)
    {
	    printf("学号:%d\t性名:%s\t年龄:%d\t成绩%.1lf\n",
                stu[j].id,stu[j].name,stu[j].age,stu[j].score);                                                        
    }
    return 0;
}

5、结构体指针

        有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。 那该如何访问成员,
需要使用 ->,在C语言中被称为间接引用运算符,是二目运算符,优先级同成员运算符”.“。

 下面我们用代码联系一下如何用->访问结构体指针中的成员

#include<stdio.h>
struct student{
    int no;
    char name[10];
    int age;
    double score;
}stu[3];
int main()
{
    struct student *p=stu;
    for(int i=0;i<3;i++)
    {
	    printf("请输入第%d的学生信息:",i+1);
	    scanf("%d%s%d%lf",(p+i)->no,(p+i)->name,(p+i)->age,(p+i)->score);
    }
    int max=stu[0].score,flag=0;
    for(int j=0;j<3;j++)
    {
	    if((p+j)->score)>max
	    {
	        max=()->score;
	        flag=j;
	    }
	    printf("学号:%d\t",stu[j].no);
	    printf("姓名:%s\t",stu[j].name);
	    printf("年龄:%d\t",stu[j].age);
	    printf("成绩%.1lf\t",stu[j].score);
	    printf("\n");
    }
    printf("max=%d\tno:%d\n",max,flag+1);
    return 0;
}

6、结构体传参

下面我们演示结构体传产和结构体地址传参两种方法

#include<stdio.h>
struct S
{
    int data[1000];
    int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
    printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* p)
{
    printf("%d\n", p->num);
}
int main()
{
     print1(s);  //传结构体
     print2(&s); //传地址
     return 0;
}

通过运行代码,如果让我们选择print1和print2两个函数,我们该如何选择呢?当然首选print2函数。因为函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销会比较大,所以会导致性能的下降,所以结构体传参时,我们要传结构体的地址。

以上就是结构体的总结,谢谢大家的浏览!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值