C基础知识(8):结构体、共用体、位域
结构体
数组允许定义可存储相同类型数据项的变量,而结构体是C编程中另一种用户自定义的可用的数据类型,它允许用户可以存储不同类型的数据项。
struct 语句的格式如下:
struct [structure tag]
{
member definition;
member definition;
...
member definition;
} [one or more structure variables];
其中,structure tag 是可选的。在结构定义的末尾,最后一个分号之前,还可以指定一个或多个结构变量,这是可选的。
下面是一个定义结构和访问结构成员的例子:
#include <stdio.h>
#include <string.h> struct Books {
int id;
char title[];
char author[];
char subject[];
}; int main() {
// 声明book1,类型为 Books
struct Books book1;
// 添加信息到book1
book1.id = ;
strcpy(book1.title, "Learn C program");
strcpy(book1.author, "Zhang San");
strcpy(book1.subject, "IT/Program");
// 输出book1信息
printf("%d\n", book1.id); //
printf("%s\n", book1.title); // Learn C program
printf("%s\n", book1.author); // Zhang San
printf("%s\n", book1.subject); // IT/Program
}
使用typedef关键字可以为类型取一个新的名字。例如,可以对结构体使用typedef来定义一个新的数据类型名字,然后使用这个新的数据类型来直接定义结构变量。
#include <stdio.h>
#include <string.h> typedef struct Books {
int id;
char title[];
char author[];
char subject[];
} Book; int main() {
// 声明book1,类型为 Books
Book book1;
// 添加信息到book1
book1.id = ;
strcpy(book1.title, "Learn C program");
strcpy(book1.author, "Zhang San");
strcpy(book1.subject, "IT/Program");
// 输出book1信息
printf("%d\n", book1.id); //
printf("%s\n", book1.title); // Learn C program
printf("%s\n", book1.author); // Zhang San
printf("%s\n", book1.subject); // IT/Program
return ;
}
结构也可以作为函数参数,并使用指针。指针变量访问结构的成员,必须使用 -> 运算符。
#include <stdio.h>
#include <string.h> struct Books {
int id;
char title[];
char author[];
char subject[];
}; void printBook(struct Books *book); int main() {
// 声明book1,类型为 Books
struct Books book1;
// 添加信息到book1
book1.id = ;
strcpy(book1.title, "Learn C program");
strcpy(book1.author, "Zhang San");
strcpy(book1.subject, "IT/Program");
printBook(&book1);
} void printBook(struct Books *book) {
printf("%s\n", book->title);
printf("%s\n", book->author);
printf("%s\n", book->subject);
printf("%d\n", book->id);
}
共用体
共用体是一种特殊的数据类型,允许用户在相同的内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
#include <stdio.h>
#include <string.h> // 从下面例子可以看出
// (1) 共用体占用的内存为共用体中最大的成员所占的内存。
// (2) 最后赋的值才是有效值。
union Data {
int i; // 4 Byte
float f; // 4 Byte
char c[]; // 20 Byte
}; int main() {
union Data data;
printf("Memory: %d\n", sizeof(data)); //
data.i = ;
data.f = 20.5;
strcpy(data.c, "This is a C program.");
printf("data.i: %d\n", data.i); // 损坏值
printf("data.f: %f\n", data.f); // 损坏值
printf("data.c: %s\n", data.c); // This is a C program.
return ;
}
位域
把一个(或多个)字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个(或多个)字节的二进制位域来表示。
注意事项:
(1) 一个位域必须存储在同一个字节中,不能跨两个字节。(说明一个位域不能超过8位)
(2) 一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。(也可以用空域占位,使某位域从下一单元开始。)
#include <stdio.h>
struct bs {
unsigned a :;
unsigned b :;
unsigned :; // 空域
unsigned c :;
} bit, *pbit;
int main() {
bit.a = ;
bit.b = ;
bit.c = ;
printf("%d\t%d\t%d\n", bit.a, bit.b, bit.c); // 1 15 255
pbit = &bit; // *pbit要初始化!
pbit->a = ;
pbit->b &= ; // 与运算
pbit->c |= ; // 或运算
printf("%d\t%d\t%d\n", pbit->a, pbit->b, pbit->c); // 0 7 255
}
C基础知识(8):结构体、共用体、位域的更多相关文章
- C++结构、共用体、枚举
一.结构 结构是C++OOP的基石.学习有关结构的知识僵尸我们离C++的核心OOP更近. 结构是用户定义的类型,同一个结构可以存储多种类型数据,这使得将一个事物的不同属性构成一个对象成为了可能.另外C ...
- 5、数组&字符串&结构体&共用体&枚举
程序中内存从哪里来 三种内存来源:栈(stack).堆(heap).数据区(.date): 栈(stack) 运行自动分配.自动回收,不需要程序员手工干预: 栈内存可以反复使用: 栈反复使用后,程序不 ...
- C语言高级-结构,共用体,文件,链表
C语言结构 标准声明方式 struct student{ int age; char sex; }; 这个可以在main函数中定义: struct student ...
- C语言基础 (11) 结构体 ,共用体 枚举 typedef
1 课堂回顾 作用域与生命周期 2 static 局部变量 2 打字游戏 3 内存分区代码分析 4 结构体基本操作 (复合类型[自定义类型 #include <stdio.h> #incl ...
- 瘋子C语言笔记(结构体/共用体/枚举篇)
(一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student { int num; char name ...
- C++复合类型(结构,共用体,枚举)
•结构是用户定义的类型,而结构的声明定义了这种类型的数据属性. 一.关键字struct声明: 定义了一种新类型 struct inflatable{ char name[20];//结构成员 fl ...
- CSS基础知识—【结构、层叠、视觉格式化】
结构和层叠 选择器的优先级顺序: style[内联元素]选择器>Id选择器>类选择器 属性选择器>元素选择器>通配器选择器 重要性:@important 有这个标记的属性值,优 ...
- iOS底层基础知识-文件目录结构
一:iOS沙盒知识 出于安全考虑,iOS系统把每个应用以及数据都放到一个沙盒(sandbox)里面,应用只能访问自己沙盒目录里面的文件.网络资源等(也有例外,比如系统通讯录.照相机.照片等能在用户授权 ...
- C语言基础知识-循环结构
用while打印出1~100之间7的倍数 int i = 1; while循环是当条件表达式的结果为真时,执行大括号里面的循环体,重复执行直到条件表达式的结果为假时结束循环. w ...
- java基础知识—循环结构
1.while 循环 语法: while(循环操作){ 循环操作: } 特点:先判断,再执行:2. == : 用于数字比较 比较的是地址 equals: 用于字符串比较 比较的是字符 3.do-whi ...
随机推荐
- Redis 与 MQ 的区别
Redis是一个高性能的key-value数据库,它的出现很大程度补偿了memcached这类key-value存储的不足.虽然它是一个数据库系统,但本身支持MQ功能,完全可以当做一个轻量级的队列服务 ...
- 个人项目WordCount基础功能
码云地址:https://gitee.com/stedylan/WordCount 1.PSP表格: PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 10 1 ...
- $y=\sin(\omega x)$平移到$y=\sin (\omega x+\varphi)$动态过程(交互式)
可以拖动滑动条的\(\omega\)和\(\varphi\)看动态效果
- slices = [dicom.read_file(path + '/' + s) for s in os.listdir(path)] FileNotFoundError: [WinError 3] 系统找不到指定的路径。
最近跟着kaggle做一个医疗项目,加载路径总是出错. 将下面箭头处: 改为: path = os.path.join(data_dir, patient)问题迎刃而解 上面的路径拼接方法可能是ipy ...
- mongoTemplate CURD 和模糊查询(转)
此文基于Spring的MongoTemplate,介绍MongoDB比较基础常用的增删改查操作.涵盖了从集合创建.索引创建和CRUD操作到更高级的功能(如Map-Reduce和聚合)等等.不多说,直接 ...
- 题解 [CQOI2015]任务查询系统
题面 解析 首先,我们考虑下暴力的做法: 每次将一个任务的重要度加入到它的区间中, 询问的时候就直接加前\(k\)大. 然而,这样肯会炸的(都说了是暴力了). 其实,我们可以转化一下区间修改(因为区间 ...
- C# 计算小数
private void button2_Click(object sender, EventArgs e) { ; List<string> list = new List<str ...
- MySQL数据库中的索引(二)——索引的使用,最左前缀原则
上文中,我们了解了MySQL不同引擎下索引的实现原理,在本文我们将继续探讨一下索引的使用以及优化. 创建索引可以大大提高系统的性能. 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. ...
- 灰度图像--图像增强 Robert算子、Sobel算子
学习DIP第36天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...
- vue刷新子页面,跳到主页,params传参引起的血案!
今天,算是真正认识了params传参,为什么说params传参引起了血案? 起因是这样的,我正在做一个登陆的模块,公司想根据url不同的参数来区分是什么类型的会议, 于是后端推荐我用params传参的 ...