C语言基础五(结构体)

结构体

结构体是一种数据结构.
数组也是一种数据结构,但是数组存放的数据类型比较单一,结构体解决了数组里不能存放 多种类型数据 的这种缺陷。

结构体声明,定义
//声明
struct infor        // struct infor 是标识符,必须整体使用
{
    char name[50];  // (元素)成员变量(属性)
    char is_male;
    int age;
};          // 分号坚决不能少

//定义
struct infor stu; 
//声明时,不占空间,只是声明了一种数据类型,定义时才分配空间

声明时可以直接定义
struct infor
{
    char name[50];  
    char is_male;
    int age;
}stu1, stu2, *p_stu = &stu1; 

或者定义s变量,一般不会这么写
struct 
{
    int a;
    float b;
    char c;
}s;
结构体初始化
struct STU
{
    char name[50];  
    char is_male;
    int age;
}; 
struct STU s1 = {"abc", 1}; //初始化时按成员顺序赋值,不完全初始化时补0.
struct STU s2 = {.age=27, .name="qew"}; //单独赋值。
struct STU *p_stu = &s1;
取成员

结构体变量取成员用 ‘.’ 运算符,结构体指针取成员需要用 ‘->’ 运算符

初始化之后赋值就必须对成员单独一一赋值了。
s1.age = 18;
p_stu -> age = 16;

相同结构体变量之间可以直接赋值,在C++里有个称呼叫做:赋值构造
s1 = s2;

typedef结构体的新类型定义

typedef struct infor
{
    int a;
    float b;
    char c;
}S, *p_S;
//S是struct infor的类型名,p_S是struct infor * 的类型名
//相当于typedef struct infor S; 
S a;
p_S p = &a;

结构体类型的大小

计算机为了方便寻址,对结构体有字节对齐策略

struct str1      // 7个字节有效数据
{
    int a;       // 4,int类型从地址是4的倍数处开始存储
    char b;      // 1 + 1 //填充了1字节空间
    short c;     // 2 ,short类型从地址是2的倍数处开始存储
}s1; // 8

struct str2
{
    char a;     // 1
    char b;     // 1
            // + 2  填充了2字节空间
    int c;      // 4
}s2; // 8

struct str3         // 6
{
    int a;
    char b;
    char c;
            // + 2 填充了2字节空间
}s3;  // 8

struct str4     // 10
{
    struct str1 s;  // 8
    char a;         // 1 + 3 填充了3字节空间,因为struct str1中有int类型,所以要补齐4个字节。
}s4; // 12

struct str5     // 10
{
    short a[4];  // 8
    char b;         // 1 + 1 填充了1字节空间       
}s4; // 10

结构体类型大小与结构体成员中所占字节数最大的那个基本数据类型对齐。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值