C语言结构体学习总结

C语言中包含short、int、long、char、float、double这六中基本数据类型。当然还有构造类型、指针类型、和空类型。如图所示:

今天,我们着重总结一下构造数据类型中的结构体 (关键字:struct,不能省略) 的相关知识。

1.什么是结构体?

结构体是一种工具,用这个工具可以定义自己的数据类型。同时,从上图可以看出结构体属于构造数据类型。

2.结构体与数组的比较

(1)都由多个元素组成

(2)各个元素在内存中的存储空间是连续的

(3)数组中各个元素的数据类型相同,而结构体中的各个元素的数据类型可以不相同

3.结构体的定义和使用

(1)一般形式

struct 结构体名 {
    类型名1 成员名1;  //成员类型可以是基本类型或构造型
    类型名2 成员名2;
    ...
    类型名n 成员名n;
};    //注意不要忘记此处的;

例如,我们要表示一个学生的个人基本信息。如 姓名、性别、年龄、分数等基本信息,我们则可以如下定义:

struct Student{
    char name[10];
    char sex;
    int age;
    float score;
};

(2)定义结构体类型的变量、指针变量和数组

定义结构体类型变量有以下三种方法,本人比较喜欢第三种。

方法一:定义结构体类型时,同时定义该类型的变量

struct [Student] {   /*[]表示结构体名是可选的*/
    char name[10];
    char sex;
    int age;
    float score;
}stu1,*ps,stu[5]; /*定义结构体类型的普通变量,指针变量和数组*/

方法二:先定义结构体类型,再定义该类型的变量

struct Student {   /*[]表示结构体名是可选的*/
    char name[10];
    char sex;
    int age;
    float score;
};

struct Student stu1,*ps,stu[5]; /*定义结构体类型的普通变量,指针变量和数组*/

方法三:用类型定义符typedef先给结构体类型名别名,再用别名定义变量

typedef struct [Student] {
    char name[10];
    char sex;
    int age;
    float score;
}Stu;
Stu stu1,*ps,stu[5]; /*用别名定义结构体类型的普通变量,指针变量和数组*/

说明:

结构体类型与结构体变量概念不同。

1.类型:不分配内存;变量:分配内存;

2.类型:不能赋值、存取、运算;变量:可以;

3.结构体可以嵌套;

4.结构体成员名与程序中变量名可相同,不会混淆。

例如:

struct date{
    int month;
    int year;

};


struct student{
    int num;
    char name[20];
    struct date birthday;  /*结构体可嵌套*/

}Stu;

(3)给结构体变量赋初值

一般格式:结构体类型 结构体变量名 = {初始表值};

方法一:

 struct [Student] {
    char name[10];
    char sex;
    int age;
    float score;
}stu[2]={{"ZhangSan",'F',22,90},{"Su",'M',20,85}};

方法二:

struct student{
    char name[10];
    int age;
    float score[5],ave;
};

struct student  Stu = {"ZhangSan",22,99,78,99,76,88};

注:ANSI C允许两个相同结构的结构体变量直接赋值

struct student li,zhang = {"zhang",20,92,90,98,67,0};
       li=zhang;  //将zhang对象拷贝一份赋值给li
            /*但 li = {"li",19,76,56,90,69,80};是非法的*/

(4)引用结构体变量中的成员

a.结构体变量名·成员名:stu1.name

b.结构体指针变量—>成员名:ps—>name

c.(*结构体指针变量).成员名:(*ps).name

d.结构体变量数组名.成员名:stu[0].name

注:1.求结构体类型数据的字节数

sizeof(变量名或类型名);

2.嵌套结构体中成员的引用

结构体嵌套时,逐级引用

struct student{
    int num;
    char name[20];
    struct date{
        int month;
        int day;
        int year;
    }Birthday;

}stu1,stu2;


//给出生日期的年份赋值
stu1.Btrthday.year = 1999;

4.结构体指针变量的定义和引用

1.结构体指针变量的定义

定义形式:struct 结构体名 *结构体指针名;

struct student *p;  //此时指针变量*p中存放的是----结构体变量在内存的起始地址


//例:

struct student{
    int num;
    char name[20];
    char sex;
    int age;
}Stu;
struct student *p = &Stu;

2.结构体指针变量的引用

使用结构体指针变量引用成员形式

(*结构体指针变量名).成员名 <=> 结构体指针变量名—>成员名 <=> 结构体变量名.成员名(<=>是等价符号哈,各位看官莫慌=_=!)

例:

int n;
int *p = &n;
*p = 10; <=> n = 10;
struct student{
    long int num;
    char name[20];
    char sex;
    float score;
}Stu1;

struct student *p = &Stu1;

Stu1.num = 10; <=> (*p).num = 101; <=>p —>num = 101;

 

5.用结构体类型和基本数据类型的定义变量的对比

 

注:感谢博主 I come,I conquer  的博文帮助,附上原文地址:https://www.cnblogs.com/JCSU/articles/1487302.html

 

  • 62
    点赞
  • 195
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值