1.结构体

a、结构体类型定义
b、结构体变量定义
c、结构体变量的初始化
d、typedef改类型名
e、点运算符和指针法操作结构体
f、结构体也是一种数据类型,复合类型,自定义类型

2.结构体变量的定义

(1).先定义类型,再定义变量(常用)

  1. struct Teacher t1; //全局变量

(2).定义类型同时定义变量

  1. struct Teacher2
  2. {
  3. char name[];
  4. int age;
  5. }t3 = {"tom", };
  6.  
  7. struct
  8. {
  9. char name[];
  10. int age;
  11. }t5;

3.结构体变量的初始化

定义变量时直接初始化,通过{}

  1. struct Teacher t7 = { "lily", };

4.typedef改类型名

  1. typedef struct Teacher3
  2. {
  3. char name[];
  4. int age;
  5. }Teacher3;
  6.  
  7. struct Teacher3 t8;
  8. Teacher3 t9;

5.定义结构体指针

使用是要先分配空间,再使用;

6.结构体数组

7.结构体嵌套一级指针

8.结构体嵌套二级指针

9.结构体做函数参数

10.结构体深拷贝和浅拷贝

(1).结构体浅拷贝

结构体中嵌套指针,而且动态分配空间;

同类型结构体变量赋值;

不同结构体成员指针变量指向同一块内存;

  1. Teacher t1; //定义结构体变量
  2. t1.name = (char *)malloc();
  3. strcpy(t1.name,"mike");
  4. t1.age = ;
  5. Teacher t2; //结构体变量
  6. t2 = t1;
  7. printf("[t2]%s,%d\n",t2.name,t2.age);
  8. if(t1,name != NULL)
  9. {
  10. free(t1.name);
  11. t1.name = NULL; //t1,t2指向同一块动态分配的内存,只要释放一次
  12. }

(2).深拷贝(人为增加内容,重新拷贝)

  1. Teacher t1; //定义结构体变量
  2. t1.name = (char *)malloc();
  3. strcpy(t1.name,"mike");
  4. t1.age = ;
  5. Teacher t2; //结构体变量
  6. t2 = t1;
  7. t2.name = (char *)malloc(); //重新增加内容
  8. printf("[t2]%s,%d\n",t2.name,t2.age);
  9. if(t1.name != NULL)
  10. {
  11. free(t1.name);
  12. t1.name = NULL;
  13. }
  14. ift2.anme != NULL
  15. {
  16. free(t2.name );
  17. t2.name = NULL; //t1,t2不是指向同一块内存
  18. }

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)的更多相关文章

  1. 结构体 typedef关键字

    1 结构体 #include <iostream> #include <cstring> using namespace std; void printBook( struct ...

  2. 我学C的那些年[ch02]:宏,结构体,typedef

    c语言的编译过程: 预处理 编译 汇编 链接 而预处理中有三种情况: 文件包含( #include ) 条件编译(#if,#ifndef,#endif) 宏定义( #define ) 宏就是预处理中的 ...

  3. 结构体 + typedef

    简单结构体 struct student{ char name[20];   //可以用scanf或者直接赋值 *如果用char *name  在用scanf时没有内存接收 long id; int ...

  4. 结构体 typedef struct hash_cell_struct hash_cell_t;

    typedef struct hash_cell_struct hash_cell_t; struct hash_cell_struct{ void* node; /*!< hash chain ...

  5. 结构体typedef struct dtuple_struct dtuple_t;

    /** Structure for an SQL data tuple of fields (logical record) */ struct dtuple_struct { ulint info_ ...

  6. C语言基础 (11) 结构体 ,共用体 枚举 typedef

    1 课堂回顾 作用域与生命周期 2 static 局部变量 2 打字游戏 3 内存分区代码分析 4 结构体基本操作 (复合类型[自定义类型 #include <stdio.h> #incl ...

  7. p/invoke碎片,对结构体的处理

    结构体的一些相关知识 可直接转换类类型,比如int类型,在托管代码和非托管代码中占据内存大小 和意义都是一个样的. 结构体封送的关键是:在托管代码和非托管代码中定义的一致性.什么是定义的一致性?包括结 ...

  8. C语言一维数组、二维数组、结构体的初始化

    C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...

  9. [C]语法, 知识点总结(二. 结构体, 类别名, static, const)

    结构体 定义: struct Student{ // 定义结构体Student, stu是创建的对象         char a[17]; // 结构体里面可以有多种不同类型的变量         ...

随机推荐

  1. file_get_contents函数偶尔报错的抑制显示

    $result = @file_get_contents($url);可以使用@进行抑制file_get_contents()的报错 @是为了抑制错误显示,让用户看不到,提升用户体验.注意:只是抑制错 ...

  2. java基础编程题练习(二)

    1.回文数 思路一:使用java特有解法,将原数字以字符串存储,翻转后赋值给新的字符串变量,再使用equals与原字符串进行对比 import java.util.Scanner; public cl ...

  3. pl/sql学习(6): 引号/程序调试/列中的字符串合并/正则表达式

    有关自治事务的问题: https://www.cnblogs.com/princessd8251/p/4132649.html 我在plsql development学习中遇到的常见问题: (一) 引 ...

  4. RGB与HSB之间转换

    先来了解一些概念: 1.RGB是一种加色模型,就是将不同比例的Red/Green/Blue混合在一起得到新颜色.通常RGB颜色模型表示为: 2.HSB(HSV) 通过色相/饱和度/亮度三要素来表达颜色 ...

  5. docker hub加速访问设置

    前言:docker是国外的,虽然有个版本开源免费,但是其docker  hub还是在国外,刚刚安装后,拉镜像就会发现,连接请求超时,中断服务,这是因为防火墙的问题,所以要将源指向国内的知名docker ...

  6. Python面向对象之-反射

    Python中一切皆对象,在Python中的反射:通过字符串的形式操作对象的属性 hasattr  判断是否有改属性或者方法,有返回True,没有返回false getattr  如果是属性获得该属性 ...

  7. HRBUST 1181 移动 bfs模板

    #include<bits/stdc++.h>///该头文件为万能头文件,有些学校oj不能使用,读者可根据需要自行修改 using namespace std; ; int vis[MAX ...

  8. Echarts跟随容器自适应大小问题

    窗口大小改变市echarts图表常常会溢出,这时候会很难看,于是查看文档和百度下后,有如下解决方案: var myChart = echarts.init(document.getElementByI ...

  9. NOIP-Cantor表

    题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 我们以Z字形给上表的每一项编号.第一项是1/1,然后是1/2,2/1,3/1,2 ...

  10. 转 InnoDB索引

    原文: http://blog.codinglabs.org/articles/theory-of-mysql-index.html InnoDB索引实现 虽然InnoDB也使用B+Tree作为索引结 ...