C语言学习笔记(五)——复合类型

本文详细介绍了C语言中的复合类型,包括结构体的对齐原则、位字段、数组、嵌套及指针操作;联合体的概念和使用;枚举类型的作用;以及typedef在增强代码可读性和可维护性上的应用。通过实例分析,帮助读者深入理解这些概念。
摘要由CSDN通过智能技术生成

1.结构体

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
    char name[100];
    int age;
};//注意这里有;

int main()
{
    struct student st;//定义了一个student类型的结构体变量,名字叫st
    st.age=20;
    strcpy(st.name,"刘某");
    printf("name=%s,age=%d\n",st.name,st.age);
    return 0;

}

初始化方法

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
    char name[100];
    int age;
};//注意这里有;
int main()
{
    //struct student st={"王某",50};//定义结构变量的时候,同时初始化成员变量的值,很像数组
    //struct student st={"王某"};//定义结构变量的时候,同时初始化成员变量的值,如果没输入,默认零
    //struct student st={0};//定义结构变量的时候,同时初始化成员变量的值,字符串空,年龄是0
    //struct student st={.age=30, .name="孙某"};//定义结构变量的时候,同时初始化成员变量的值,可以用这种方式打乱顺序
    printf("name=%s,age=%d\n",st.name,st.age);
    return 0;
}

1.1结构体的对齐

一个结构体变量成员总是以最大的那个元素作为对齐单位

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
struct A
{
    char a1;
    char a2;//如果不考虑a3,增加一个成员,下面输出a占用的内存增加一个字节
    int a3;//这里a占用的内存为八字节,因为要以int对齐,总是以int为单位来变化
};//注意这里有;
struct B
{
    char a1;
    short a2;
    char a4;//在这里放char的时候,short已经把内存占了,没地方放char了,所以结构体B占用总为12个字节。
    int a3;//上边两个加起来没一个int大,所以,为八个字节,但是不知道short的位置
};

int main()
struct A a;
struct B b={
  1,2,3};
printf("%u\n",sizeof(a));//输出a占用的内存为一个字节
printf("%p\n",&a);//在这里做一个断点,然后单步调试,选择调试,内存,查看内存内容
return 0;

图形说明上述程序:
这里写图片描述
对于structB
这里写图片描述
加了char a4的情况为:

这里写图片描述
此时,非常简单的优化方法是把a4和a3换个位置,减少内存浪费。

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
struct D
{
    char a[10];

    int b;//此时输出d的占用内存大小为16,可以肯定它没有按照char a[10]对齐,否则应该是十的倍数,其实它还是按照int对齐的,是4的倍数,如果结构体成员出现数组,那么是以数组的具体每个成员作为对齐标准。
    //如果int b改成char b,那么这个结构体中的成员都是一种类型,那么这个结构变量在内存中就基本和一个数组类似。可以用char *s=&d;结构体本身是个变量,不能直接当数组名用,所以要取地址。甚至可以写成s[0]=1;s[10]=2;
};//注意这里有;
struct E 
{
    char a1;
    short a2;//有一个字节被浪费了
    int a3;
};
struct F
{
    char a1;
    short a2;
    int a3;
    short a4;
    char a5;//此时,a1a2a3a4的内存位置都已知,a5是处于紧挨着short后面的下一个地址还是填充最后一个字节呢?结果是紧挨着的那个地址,最后一个字节是空的。
};
int main()
{
    struct D d;
    printf("%u\n",sizeof(d));
    return 0;
    printf("%p,%p\n",&d,d.a);//d.a是一个数组名,这里要弄清楚,这俩地址是一样的,结构体变量的地址,就是这个结构体首元素的地址
    struct E e={
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值