[黑马程序员]C语言结构体
2015-08-21 16:19
239 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
“结构”是一种构造数据类型,它由若干个“成员”组成,每个成员可以是基本数据类型或者构造类型。
C语言中的构造类型:数组类型;结构体类型;共用体(联合)类型。
example:
先定义结构体,再定义结构体变量
定义结构体变量的同时,定义结构体变量
使用匿名结构体定义结构体变量
注意:结构体定义完毕后,计算机并不会给结构体分配内存空间;定义结构体变量后,才会分配内存空间。
内存对齐:取结构体成员中占用最大的数据类型,每次分配内存按最大数来分配,最终占用的字节数必然是最大数的倍数。
每次按4个字节分配,这个结构体占用12个字节。
每次按8个字节分配,a分配8个字节,占用4个字节,由b去填充;c分配8个字节,占用1个字节,剩余7个字节;d占用8个字节,无法占用c剩下的,继续分配8个字节,总共是24个字节。有时候因为各个成员的先后顺序不一样,会影响占用的字节总数。
0x00 结构体简介
在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名为字符型;学号可为整型或字符型;年龄为整型;成绩可为整型或实型。显然,这些数据不可能用同一个数组来存放这组数据。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。“结构”是一种构造数据类型,它由若干个“成员”组成,每个成员可以是基本数据类型或者构造类型。
什么是构造类型?
构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“元素”或“成员”,每一个“成员”都是一个基本数据类型或构造类型。C语言中的构造类型:数组类型;结构体类型;共用体(联合)类型。
为什么要有结构体?
结构体可以把数据组织起来,存在一起,使用的时候更方便。在调用函数时,若传递的参数比较多,传一个结构体相对而言简单一些。0x01 定义结构体
定义方式:struct 结构名{成员1; 成员2; 成员3; ...};
example:
struct Student{ char name[20]; int age; char sex; };
0x02 结构体变量定义
定义结构体变量有三种方式:先定义结构体,再定义结构体变量
定义结构体变量的同时,定义结构体变量
使用匿名结构体定义结构体变量
注意:结构体定义完毕后,计算机并不会给结构体分配内存空间;定义结构体变量后,才会分配内存空间。
struct Student{ char name[20]; int age; char sex; };
struct Student stu; //分别定义结构体、结构体变量
struct Student{ char name[20]; int age; char sex; }stu,stu1; //定义结构体的同时,定义结构体变量
struct{ char name[20]; int age; char sex; }stu,stu1; //匿名结构体定义结构体变量
0x03 结构体成员的访问方式
在程序中使用结构变量时,往往不把它作为一个整体来使用。在ANSI C中除了允许具有相同类型的结构变量相互赋值以外,一般对结构变量的使用,包括赋值、输入、输出、运算都是通过结构变量的成员来实现的。结构体变量成员访问方式一般为变量名.成员名;例如,
stu.name,
stu.age。如果成员本身又是一个结构体,则需要逐级找到最低级成员才能使用,如:
stu.birthday.month。
0x04 结构体变量的初始化
struct Student stu1; //先定义,后赋值 strcpy(stu1.name,"张三丰"); stu1.age = 10; stu1.sex = '女';
struct Student stu1 = {"张三丰", 10, '女'}; //定义时初始化,赋值顺序要跟成员顺序保持一致
struct Student stu1 = {.name="张三丰"}; //指定成员初始化
0x05 结构体存储原理
结构名只能表示一个结构形式,编译系统并不会对它分配内存空间。只有当结构体变量被说明的时候,才会对该变量分配内存空间。结构体占用的内存空间为每个成员占用的字节数之后和,还要考虑内存对齐。
内存对齐:取结构体成员中占用最大的数据类型,每次分配内存按最大数来分配,最终占用的字节数必然是最大数的倍数。
struct A{ int a; //占用4个字节 float b; //占用4个字节 char c; //占用1个字节 }
每次按4个字节分配,这个结构体占用12个字节。
struct A{ int a; //占用4个字节 float b; //占用4个字节 char c; //占用1个字节 double d; //占用8个字节 }
每次按8个字节分配,a分配8个字节,占用4个字节,由b去填充;c分配8个字节,占用1个字节,剩余7个字节;d占用8个字节,无法占用c剩下的,继续分配8个字节,总共是24个字节。有时候因为各个成员的先后顺序不一样,会影响占用的字节总数。
0x06 总结
结构体的定义和使用还是挺简单的,学习过程中没有遇到什么问题。相关文章推荐
- C++中的set_new_handler和new_handler 【未完待续】
- C++字符串转数字,数字转字符串
- java语言和C/C++语言的关系
- Z字形扫描
- C++11 右值引用与move语义
- C语言的static和extern关键字的使用
- C/C++编程题之计算一个数字的立方根
- C++类模板的三种特化
- 分步编译一个C语言文件
- 黑马程序员-[C语言-指针和文件操作]学习日记(四)
- C++无名命名空间详解
- C++并发编程学习笔记<1> 入门
- 浅谈C语言中的联合体
- C++ Primer 5e chapter 9.1
- c++ 中文分词介绍
- C语言提高之技术模型层次、学习标准、特点、内存四区、函数调用模型
- C++模板函数和模板类的诠释
- 黑马程序员-[C语言字符串和数组]学习日记(三)
- C++ __asm关键字
- Log4j日志级别