17.结构体(typedef)
1.结构体
a、结构体类型定义
b、结构体变量定义
c、结构体变量的初始化
d、typedef改类型名
e、点运算符和指针法操作结构体
f、结构体也是一种数据类型,复合类型,自定义类型
2.结构体变量的定义
(1).先定义类型,再定义变量(常用)
struct Teacher t1; //全局变量
(2).定义类型同时定义变量
struct Teacher2
{
char name[];
int age;
}t3 = {"tom", }; struct
{
char name[];
int age;
}t5;
3.结构体变量的初始化
定义变量时直接初始化,通过{}
struct Teacher t7 = { "lily", };
4.typedef改类型名
typedef struct Teacher3
{
char name[];
int age;
}Teacher3; struct Teacher3 t8;
Teacher3 t9;
5.定义结构体指针
使用是要先分配空间,再使用;
6.结构体数组
7.结构体嵌套一级指针
8.结构体嵌套二级指针
9.结构体做函数参数
10.结构体深拷贝和浅拷贝
(1).结构体浅拷贝
结构体中嵌套指针,而且动态分配空间;
同类型结构体变量赋值;
不同结构体成员指针变量指向同一块内存;
Teacher t1; //定义结构体变量
t1.name = (char *)malloc();
strcpy(t1.name,"mike");
t1.age = ;
Teacher t2; //结构体变量
t2 = t1;
printf("[t2]%s,%d\n",t2.name,t2.age);
if(t1,name != NULL)
{
free(t1.name);
t1.name = NULL; //t1,t2指向同一块动态分配的内存,只要释放一次
}
(2).深拷贝(人为增加内容,重新拷贝)
Teacher t1; //定义结构体变量
t1.name = (char *)malloc();
strcpy(t1.name,"mike");
t1.age = ;
Teacher t2; //结构体变量
t2 = t1;
t2.name = (char *)malloc(); //重新增加内容
printf("[t2]%s,%d\n",t2.name,t2.age);
if(t1.name != NULL)
{
free(t1.name);
t1.name = NULL;
}
if(t2.anme != NULL)
{
free(t2.name );
t2.name = NULL; //t1,t2不是指向同一块内存
}
11.结构体字节对齐
原则1:数据成员的对齐规则(以最大的类型字节为单位)。
结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方(比如int在32位机为4字节,则要从4的整数倍地址开始存储)
原则2:结构体作为成员的对齐规则。
如果一个结构体B里嵌套另一个结构体A,则结构体A应从offset为A内部最大成员的整数倍的地方开始存储。(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。),结构体A中的成员的对齐规则仍满足原则1、原则2。
注意:
1. 结构体A所占的大小为该结构体成员内部最大元素的整数倍,不足补齐。
2. 不是直接将结构体A的成员直接移动到结构体B中
原则3:收尾工作
结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
17.结构体(typedef)的更多相关文章
- 结构体 typedef关键字
1 结构体 #include <iostream> #include <cstring> using namespace std; void printBook( struct ...
- 我学C的那些年[ch02]:宏,结构体,typedef
c语言的编译过程: 预处理 编译 汇编 链接 而预处理中有三种情况: 文件包含( #include ) 条件编译(#if,#ifndef,#endif) 宏定义( #define ) 宏就是预处理中的 ...
- 结构体 + typedef
简单结构体 struct student{ char name[20]; //可以用scanf或者直接赋值 *如果用char *name 在用scanf时没有内存接收 long id; int ...
- 结构体 typedef struct hash_cell_struct hash_cell_t;
typedef struct hash_cell_struct hash_cell_t; struct hash_cell_struct{ void* node; /*!< hash chain ...
- 结构体typedef struct dtuple_struct dtuple_t;
/** Structure for an SQL data tuple of fields (logical record) */ struct dtuple_struct { ulint info_ ...
- C语言基础 (11) 结构体 ,共用体 枚举 typedef
1 课堂回顾 作用域与生命周期 2 static 局部变量 2 打字游戏 3 内存分区代码分析 4 结构体基本操作 (复合类型[自定义类型 #include <stdio.h> #incl ...
- p/invoke碎片,对结构体的处理
结构体的一些相关知识 可直接转换类类型,比如int类型,在托管代码和非托管代码中占据内存大小 和意义都是一个样的. 结构体封送的关键是:在托管代码和非托管代码中定义的一致性.什么是定义的一致性?包括结 ...
- C语言一维数组、二维数组、结构体的初始化
C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...
- [C]语法, 知识点总结(二. 结构体, 类别名, static, const)
结构体 定义: struct Student{ // 定义结构体Student, stu是创建的对象 char a[17]; // 结构体里面可以有多种不同类型的变量 ...
随机推荐
- Axis接口
Axis支持三种web service的部署和开发,分别为: 1.Dynamic Invocation Interface ( DII) 2.Dynamic Proxy方式 3.Stubs方式Dyna ...
- 2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算
2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算 经过第一阶段的学习,同学们已经熟悉了这门语言基本的用法.在一次又一次对着电脑编写并提交代码,进行练习的时候,有没有觉 ...
- MySQL批量更新字段url链接中的域名
1. 首先进行数据库备份 2. SQL语句 UPDATE 表名 SET 字段 = REPLACE(字段, '待更新的内容','替换值'); eg: UPDATE 98k_images SET url ...
- Java_变量类型
目录 主要是为了复习java相关知识,本文主要内容来自于 http://www.runoob.com/java 一.局部变量 局部变量声明在方法.构造方法或语句块中 在方法.构造方法.语句块被执行的时 ...
- select获取选中的option(包含value和text,重点是text怎么获取)
简单描述:后台需要获取到select标签选择的内容,也就是text,该怎么取呢?很简单. 代码: //hml代码<div class="col-md-6"> <l ...
- python2 安装 MySQL-python
yum -y install mysql-devel libxml2 libxml2-dev libxslt* zlib gcc openssl yum install gcc libffi-deve ...
- GRPC单向/双向流
开始食用grpc(之二)https://www.cnblogs.com/funnyzpc/p/9570992.html 开始食用grpc(之一)https://www.cnblogs.com/funn ...
- Gradle: Download 下载慢的解决办法
应该是gradle被墙了,在网上查得:使用阿里云的国内镜像仓库地址,就可以快速的下载需要的文件: 修改项目根目录下的文件 build.gradle : buildscript { repositori ...
- xstream实现对象的序列化和反序列化(Java)
概述 最新整理Java方面XML序列化和反序列化的常用工具类,找到了dom4j和xstream.dom4j相对小巧,很好的解读xml:但是对于对象的xml序列化和反序列化,我还是比较喜欢xsteam( ...
- CoopyIII开发文档之控制LED灯开关
作者:那年:QQ:843681152 一. CooplyIII环境的搭建 工欲善其事必先利器,如何搭建CooplyIII的开发环境是一切coolpyIII开发的前提.CoolpyIII作者内cool超 ...