结构体

C语言 专栏收录该内容
25 篇文章 0 订阅


一个基本数据类型无法解决的问题,由结构体来完成。
数组也可以存放多个数据,但是要求数据类型一致,所以无法使用。

结构体声明

struct 结构体声明
{
结构体成员1;
结构体成员2;
结构体成员3...
};
struct Book
{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
};//注意这里要有封号

注意声明的时候并不会分配存储空间,直到真正定义一个结构体变量才开始分配存储空间。

定义结构体类型变量

struct 结构体名称 结构体变量名

#include<stdio.h>

//定义书的结构体
struct Book
{
    char title[128];
    char author[40];
    float price;
    unsigned int date;
    char publisher[40];
    
};
//或者直接在声明的时候进行定义
/*struct Book
{
    char title[128];
    char author[40];
    float price;
    unsigned int date;
    char publisher[40];
    
}book;*/

int main()
{
    struct Book book;
    return 0;
}

访问结构体变量

在这里插入图片描述
一个简单地书籍录入程序

#include<stdio.h>

//定义书的结构体
struct Book
{
    char title[128];
    char author[40];
    float price;
    unsigned int date;
    char publisher[40];
    
};
//或者直接在声明的时候进行定义
/*struct Book
{
    char title[128];
    char author[40];
    float price;
    unsigned int date;
    char publisher[40];
    
}book;*/

int main()
{
    struct Book book;
    printf("input book name: ");
    scanf("%s",book.title);//数组名不用&
    printf("input writer:");
    scanf("%s",book.author);//字符串默认的就是取字符串的首字符地址,所以不需要&
    printf("input price:");
    scanf("%f",&book.price);
    printf("input the publish date:");
    scanf("%d",&book.date);
    printf("input publish place:");
    scanf("%s",book.publisher);
    
    
    printf("name:%s\n",book.title);
    printf("price:%.2f\n",book.price);
    printf("date:%d\n",book.date);
    
    return 0;
}

初始化结构体变量

在这里插入图片描述

初始结构体的指定成员值

可以让程序只初始化Book的price成员
struct Book book ={.price=48.8};
还可以不按结构体声明的成员顺序进行初始化

struct Book book={
.publisher="清华大学出版社".price=48.8,
.date=20171111
};//这个时候不需要按顺序 注意初始化的时候是用逗号

结构体内存

struct A
{
    char a;
    int b;
    char c;
}a={'x',520,'o'};

printf("size of a =%d \n",sizeof(a));

第一反应 内存大小是 1+4+1 等于6个字节
但是这是错的!!
正确答案是 12
因为编译器会对结构体成员进行了内存对齐
在这里插入图片描述
对于32位系统来说,对齐系数一般是4个字节。
牺牲空间换时间
进一步修改结构体

struct A
{
    char a;
    char c;
    int b;
}a={'x','o',520};

printf("size of a =%d \n",sizeof(a));

此时结构体将占8个字节
在这里插入图片描述
这样能够节省内存空间

共用体(union)

也有叫联合体,但叫做共用体更合理,共用体中的所有成员共用一个内存地址
定义和结构体语法类似

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
union Test
{
    int i;
    double pi;
    char str[6];
};


int main()
{
   union Test test;
   test.i=520;
   test.pi=3.14;
   strcpy(test.str,"yuyijie");
   printf("addr of test.i:%p\n",&test.i);
   printf("addr of test.pi:%p\n",&test.pi);
   printf("addr of test.str:%p\n",&test.str);
   return 0;
}

在这里插入图片描述
对共用体的成员同时赋值会导致成员值覆盖(因为共用一个内存地址)
比如无法同时打印出上述代码中共用体成员中三者的值
在这里插入图片描述
只有最后一个成员才能正确打印,之前的两个都被覆盖了

共用体的尺寸

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
union Test
{
    int i;
    double pi;
    char str[6];
};


int main()
{
   union Test test;
   test.i=520;
   test.pi=3.14;
   strcpy(test.str,"yuyijie");
   printf("addr of test.i:%p\n",&test.i);
   printf("addr of test.pi:%p\n",&test.pi);
   printf("addr of test.str:%p\n",&test.str);
   printf("size of test:%d\n",sizeof(test));
   return 0;
}

在这里插入图片描述
并不一定共用体中最大的成员尺寸,但必须足够容纳最大尺寸,定义共用体跟定义结构体语法类似。
初始化共用体略有不同,一次只能初始化一个成员(因为共用内存的关系)
在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 护眼 设计师:闪电赇 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值