首页 > 其他分享 >55.C结构体共用体阐论

55.C结构体共用体阐论

时间:2024-09-10 11:26:23浏览次数:14  
标签:struct 55 31 阐论 int printf 共用 对齐 结构

零零雨天飒风图书馆记下

先来看结构体的”结构“

struct 结构体类型名{
	成员1;
	成员2;
	.....;
}结构体变量名;
系统不会为 struct 结构体类型 分配空间 而是为结构体变量分配空间
关于结构体变量命名
	在main函数中
	struct 结构体类型名 结构体变量名 如:struct Stu a={初始化复制};
	或者在定义结构体类型的同时定义结构体变量 同样可以初始化

关于结构体变量的成员访问:
通过运算符 ”.“还有指针->

  1. 赋值
  2. 访问
  3. 该值
    看一个简单例子:
#include<stdio.h>
struct Stu {
    int id;
    char name[10];
    char sex[10];
} a = {1, "高远", "女"};

void print(struct Stu *p) {
    //结构体指针变量->成员名
    printf("%d,%s,%s\n", (*p).id, (*p).name, (*p).sex);
    printf("%d,%s,%s\n", p->id, p->name, p->sex);
}

//直接传递结构体 会占用内存性能
void print2(struct Stu b) {
    printf("%d,%s,%s\n", b.id, b.name, b.sex);
}

struct Peo {
    struct Stu c;
    int num;
};

int main() {
    //struct 结构体类型名 结构体变量名(对象)
    struct Stu b = {2, "哈哈", "男"};
    //结构体对象.成员变量
    printf("%d,%s,%s\n", a.id, a.name, a.sex);
    printf("%d,%s,%s\n", b.id, b.name, b.sex);
    print(&b);
    print2(b);
    //结构体嵌套
    struct Peo gao = {{3, "低近", "女"}, 25};
    //printf 函数不能直接打印一个结构体(如 gao.c)作为一个整体
    printf("%d,%s,%s,%d", gao.c.id, gao.c.name, gao.c.sex, gao.num);
}

上面也讲述了关于结构体的嵌套和传参 尽量使用地址传参

重点来看关于结构体变量的存储 内存对齐
1.第一个成员在结构体变量偏移量为0的地址处
2.其他成员变量要对齐到对齐数的整数倍地址处
3.结构体总大小为最大对齐数的整数倍
4.结构体嵌套的结构体对齐到最大对齐数的整数倍处
对齐数=默认对齐数(编译器8)和该成员大小的较小值

很抽象 实际很简单 直接看例子

#include "stdio.h"

struct s3 {
    double d;
    char c;
    int i;
};
struct s4 {
    char c1;
    struct s3 s3;
    double d;
};

int main() {
    printf("%d\n", sizeof(struct s3));
    printf("%d\n", sizeof(struct s4));
}

分析
image

image


关于枚举和共用体
枚举类型 可以一一列举
enum sex {
    man = 5,
    woman = 6
};
enum data {
    zero,//0
    one  //1
};
关于共用体union内存对齐
共用同一块空间
大小为最大成员大小 对齐最大对齐数的整数倍 看例子:
//联合体 共用体(共用同一块空间)
union aa {
    int a;  //4 / 8  对齐数4
    char b[5]; // 5 1 /8 对齐数1
    //最大成员大小5 最大对齐数4的整数倍 8
};
union bb {
    int d1;
    float d2;
} t;

int main() {
    printf("%d\n", sizeof(union aa));
    t.d1 = 99;
}

然后还有个 typedef 数据类型 别名


记录一些错题:
typedef long int BIG作用:
定义了一个新的数据类型标识符
声明结构体类型的同时 系统为其分配存储空间 X
在程序中不可使用和结构体类型中的成员名相同的变量名 X
共用体类型中不能使用结构体 X
共用体中的成员必须具有相同的类型 X
在一个共用体变量中 可以同时对多个成员赋值 X
结构体名在定义结构体时不可以省略 X
共用体变量初始化只能有一个常量
若修改了共用体变量中某个成员的值 则其他成员的值也会改变
//定义一个结构体变量包括年月日 计算当天在本年中是第几天 考虑闰年问题
#include "stdio.h"

struct time {
    int year;
    int month;
    int day;
};

void print(struct time com) {
    int ok[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int result = 0;
    if (com.year % 4 == 0 && com.year % 100 != 0 || com.year % 400 == 0) {
        ok[1] = 29;
    }
    for (int i = 0; i < com.month - 1; ++i) {
        result += ok[i];
    }
    printf("最终结果为:%d", result + com.day);
}

int main() {
    int a, b, c;
    printf("输入今天的日期:");
    scanf("%d %d %d", &a, &b, &c);
    printf("年:%d 月:%d 日:%d\n", a, b, c);
    struct time com = {a, b, c};
    print(com);
}
//用结构体类型输出一年中十二个月的英文名称及相应天数
#include <stdio.h>
struct Month {
    char name[20];
    int days;
};
int main() {
    struct Month months[] = {
            {"January", 31},
            {"February", 28},
            {"March", 31},
            {"April", 30},
            {"May", 31},
            {"June", 30},
            {"July", 31},
            {"August", 31},
            {"September", 30},
            {"October", 31},
            {"November", 30},
            {"December", 31}
    };
    for (int i = 0; i < 12; i++) {
        printf("%s  %d \n", months[i].name, months[i].days);
    }

    return 0;
}

标签:struct,55,31,阐论,int,printf,共用,对齐,结构
From: https://www.cnblogs.com/gaodiyuanjin/p/18405937

相关文章

  • 20240909_155524 mysql 三种变量
    什么是变量标识数据的标识符,就是变量变量是标识数据的mysql中的三种变量系统变量自定义变量局部变量系统变量查看所有系统变量showvariables;根据系统变量名查看它的值select@@系统变量名select@@autocommit修改系统变量的值set系统变量名=值setautocommit......
  • 代码随想录day55 || 图论5
    并查集197图中是否存在有效路径varfather[]intfuncvalidPath(nint,edges[][]int,sourceint,destinationint)bool{ //使用并查集算法,涉及到的操作,包括init,find,issample,join father=make([]int,n) fori,_:=rangefather{//init father[i]=i }......
  • Comsol 共用声固耦合边界与热粘性声学边界的亥姆霍兹腔体超材料板精准隔声设计
    声子晶体可分为局域共振型声子晶体和布拉格散射型声子晶体,由于布拉格声子晶体需要的结构尺寸往往很大,不便于实际应用; 而基于局域共振型机理的声子晶体能够实现“小体积控制大波长”,因而有更加广泛的应用,其中利用Helmholtz共鸣腔是局域共振型机理的典型应用,近年来......
  • 【洛谷P5587】打字练习
    【P5587】打字练习【废话】首先,作为我练习字符串的一道题,很自然的意料之中的遇到了瓶颈【前置知识】字符的输入  久远的记忆让我以为gets还能用,于是就RE了,后来又用scanf("%[^\n]",s);,但是由于没有熟练掌握,换为getchar    getchar一次只能进行一个字符的......
  • 55页PPT 美的集团从“制造”到“智造”的数字化转型之路
    获取完整PPT,以及更多涉及各行业数字化转型、大模型、制造解决方案、华为IPD资料见下图  ......
  • 基于Web的会议记录与分享系统设计与实现---附源码83155
    目  录摘要第1章绪论1.1研究背景与意义1.2开发现状第2章相关技术介绍2.1JAVA技术2.2springboot框架2.3MySQL数据库第3章系统分析3.1可行性分析3.2功能需求分析3.2.1注册用户功能3.3非功能需求分析3.4安全性需求分析3.4.1系统的......
  • rgb中的最大数值为什么是255
    在RGB(红绿蓝)颜色模型中,每种颜色的强度(或称为亮度、值)被量化为一个0到255之间的整数。这个范围的选择基于几个关键原因,主要与计算机系统的设计和历史背景有关。二进制系统的便捷性:计算机系统是基于二进制(即0和1)的。使用8位(bit)二进制数可以表示的最大数值是2^8-1=255。因此......
  • 【题解】CF1955E
    CF1955E翻译思路代码翻译原题链接CF1955E思路  由于每次操作区间长度是定值,所以我们可以说,如果最前面的数已经是1了,那它再也不会被进入操作。因为如果把它变回0,那想再变成1只能以它为起点再操作一次,前后两次操作抵消。  所以思路很简单,直接......
  • [QOJ 6355] 5
    发现至少有\(\frac{S}{5}\)个\(1\),所以考虑维护\((k,T-k)\)的对数,然后二进制拆分+维护区间连续段背包dp即可。点击查看代码#include<bits/stdc++.h>#definefirfirst#definesecsecond#defineintlonglong#definelowbit(x)x&(-x)#definemkp(a,b)make_pair(......
  • AI跟踪报道第55期-新加坡内哥谈技术-本周AI新闻: GPT NEXT (x100倍)即将在2024推出
      每周跟踪AI热点新闻动向和震撼发展想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!订阅:https://......