##笔记day15-C语言基础:结构体与共用体、工程项目管理

day15-结构体与共用体

1.结构体

结构体为自定义数据类型(构造类型)
结构体可以存储大量不同类型的数据
1)结构体类型的定义
    struct 结构体名{
        成员变量1;
        成员变量2;
        成员变量3;
        ...
    };
	eg:
struct Student{
    int id;
    char name;
    float score;
};
2)结构体变量的定义
    [1]先定义结构体类型,再通过结构体类型定义变量
    结构体类型 结构体变量名;
	struct Student List;
	[2]定义结构体类型的时候,直接定义变量名
    struct Student{
        int id;
        char name;
        float score;
    }zhangsan, wangwu;
	[3]直接定义结构体变量
    struct{
        int id;
        char name[10];
        float score;
    }lihua;
	[4]typedef
    typedef struct{
        int a;
        char b;
    }A;
	A test1;
3)结构体变量的初始化
    struct Student lisi = {29, "Lisi", 59};
4)结构体成员变量的访问
    结构体变量名.成员变量名;
    printf("id = %d, name = %s,score = %.2f\n",Lisi.id,Lisi.name,Lisi.score);

eg:

#include <stdio.h>

struct Birth{
    int year;
    int month;
    int date;
};

struct Stu{
    int id;
    char name[10];
    float score;
    struct Birth birthday;//不能直接写Birth birthday
    //前面要记得加上struct
};

int main(int argc, char *argv[])
{ 
    struct Stu ggbond;//在定义结构体变量时前面也要加上struct
    ggbond.birthday.year = 2004;//调用结构体中的结构体类型成员变量的成员变量
    printf("ggbond.year = %d\n",ggbond.birthday.year);
    return 0;
} 

2.结构体的大小

结构体的大小采用字节对齐的方式
    char   --> 1字节对齐
    short  --> 2字节对齐
    int    --> 4字节对齐
    float  --> 4字节对齐
    double --> 8字节对齐
结构体大小为最大数据类型的整数倍
    
内部结构体的最大需求大于外部结构体当前的对其要求,外部结构体会增加必要的填充以满足内部结构体的对其需求

eg1:

​ 结构体Stu所占的内存为32字节

struct Stu{
char a;
char b[11];
double c;
int d;
}test1;

在这里插入图片描述

eg2:

​ 所占内存为16字节

struct Test{
    char a;
    int b;
};
struct {
    char a;
    struct Test t1;
    short b;
}t2;

在这里插入图片描述

在这里插入图片描述

eg3:

​ 所占内存为24字节

struct Test{
    char a;
    int b;
};
struct {
    char a;
    struct Test t1;
    double b;
}t2;

在这里插入图片描述
在这里插入图片描述

3.结构体指针

指向一个结构体的指针
结构体类型 *结构体指针变量名;
eg:
struct Stu{
    int id;
    char name[10];
    float score;
};
struct Stu lisi;//定义一个结构体变量list
struct Stu *p = &list;//定义一个结构体指针指向结构体变量,结构体变量名不为结构体地址,要加&符号,这里与函数名不同,函数名直接作为函数的入口地址

注意:struct Stu --->为结构体类型(数据类型)

eg1:

#include <stdio.h>
struct Stu{
    int id;
    char name[10];
    float score;
};
int main(int argc, char *argv[])
{ 
    //定义一个结构体变量ggbond
    struct Stu ggbond = {20,"GGbond",100};
    //定义一个结构体指针指向ggbond
    struct Stu *p = &ggbond;//记住要加取地址&符号
    printf("id = %d,
           name = %s,
           score = %.2f\n",
           p->id,p->name,p->score);
    return 0;
} 

4.结构体取别名typedef

eg:

typedef struct{
    int id;
    char name[10];
    float score;
}Str, *P_str;
// Str -->该结构体数据类型的别名
// P_str -->该结构体指针类型的别名

int main(int argc, char *argv[])
{ 
    //定义一个结构体变量ggbond
    Str ggbond = {20,"GGbond",100};
    //定义一个结构体指针指向ggbond
    P_str p= &ggbond;
    printf("id = %d, name = %s, score = %.2f\n",p->id,p->name,p->score);
    //结构体指针的使用是->
    return 0;
}

5.结构体数组

1)结构体数组的定义
    结构体类型 数组名[元素个数];
	struct Stu student[10];

eg1:struct Stu lisi = {20, "Lisi", 60};
	struct Stu zhangsan = {21, "Zhangsan", 70};
	struct Stu wangwu = {22, "Wangwu", 80};
	struct Stu student[3] = {lisi, zhangsan, 

eg2:
struct Stu{
    int id;
    char name[32];
    float score;
};

int main(int argc, char *argv[])
{ 
    struct Stu a[3] = {
        {23,"xiaoming",90},
        {24,"xiaohua",100},
        {21,"xiaohong",99}
    };//定义一个结构体数组并初始化
    
    for(int i = 0; i < 3; i++)
    {
        printf("id = %d,
               name = %s, 
               score = %.2f\n",
               a[i].id, a[i].name, a[i].score);
    }//循环遍历该结构体数组,并打印结构体的成员信息

    return 0;
}

6.共用体

union 共用体名{
	成员变量1;
	成员变量2;
	成员变量3;
	...
}
1)共用体的成员使用的是同一片空间,共用体的大小为该成员变量中最大类型的大小
//定义一个共用体类型
union test{
    char a;
    int b;
};
int main(int argc, char *argv[])
{ 
    union test t1;
    t1.b = 0x12345678;
    t1.a = 0x99;
    printf("%#x\n", t1.b);
    printf("%ld\n", sizeof(t1));
    return 0;
} 

练习:

查询员工信息
	输入待查询的员工姓名:lihua
	打印lihua的员工信息
	如果没有相对应的员工姓名,打印提示信息

十一、工程项目管理

1)头文件 .h 文件	
	基本格式:
	xxx.h
	#ifndef _XXX_H
	#define _XXX_H
	1)宏定义
	2)结构体的声明
    3)函数的声明
    4)全局变量的声明
    5)取别名
    ...
    #endif
        
2)功能文件.c
    func.c
    引入头文件
    函数的定义
        
3)main.c
    主程序逻辑代码
    注意:多个.c文件应该同时编译
    gcc *.c/gcc main.c func.c

vsp func.c打开文件

gcc *.c编译同一路径所有.c文件

ctrl+ww 切换文件

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值