=============================================================================
struct A
{
  char array[100];   //array不知道在哪里呢?只是告诉c语言编译器有这么一种类型结构。是一种语法形式,不要误解。
  int a;
};

struct B
{
  char *p = malloc(100);   //所以不能这样写!
  nt a;
};

int main()
{
  struct A a;    //此时的array在栈里面。
  a.a;

  struct A *p = malloc(sizeof(struct A));    //此时的array在堆里面。此时只有一个堆。
  p->a;   //只有一个堆的时候可以用箭头->。

  return 0;
}
--------------------------------------
struct C    //占用1个字节,至少1个字节。
{
  char a : 2;
  char b : 4;
};

struct D
{
  char a : 10;   //错误的语法,char不能超过8个bit。
  char b : 4;
};

struct F    //占用8个字节。
{
  char a : 2;
  int b : 4;
};
-----------------------------------------------------------------------------
struct ABC
{
  int a;
  int b;
};

struct ABC abc1 = { 1, 2 };
struct ABC abc2 = abc1;    //浅拷贝,就是一个简单内存拷贝而已。
--------------------------------------
char array[100] = "hello";
char array2[100];
array2 = array;    //不能这么赋值,因为数组名是一个常量,不能作为左值的。
--------------------------------------
struct STR
{
  char array[100];
};

struct STR str1 = {"hello"};
struct STR str2;
str2 = str1;   //此时str2里面的array的值和str1里面的array值是一样的。因为str2和str1是一个变量名,可以作为左值的。
-----------------------------------------------------------------------------
数组最大的缺点是:如果往数组的两个成员之间插入新的数据,代价很大。因为它的内存是连续的。
而使用堆中的指针变量,只需要添加下,然后让指针重新做一个指向即可。好处:不仅可以做一个有特别多成员的结构,同时还可以自由地去删除、添加元素。
如下图所示:


-----------------------------------------------------------------------------

联合体的常用功能:做可变类型。因为他可以放很多类型,在同一时刻,只有一种类型。
类似于:javascript中好多变量是没有数据类型的。c语言可以通过联合体来实现。
(没有数据类型等价于有好多好多数据类型)
linux下示例代码:

 #include <stdio.h>

 union A
{
int a;
//double b;
char b;
}; int main()
{
union A a;
a.a = ;
a.b = ;
printf("%d\n", a.a); // return ;
}

-----------------------------------------------------------------------------

注意:不要把一个庞大的结构体作为函数的形参,因为在栈里面一定会有一个结构体变量赋值的过程。就是把实参的值赋值给形参,实际上是一个内存拷贝,代价很大。

-----------------------------------------------------------------------------

#define PAI 3.14
double a = PAI;
--------------------------------------
常量是个有限的范围时,一般用枚举enum。
--------------------------------------
typedef struct STR S;   //这样S就和int类似了,就成了一个具体的数据类型了。
S s1;
sizeof(S);
S *p = malloc(sizeof(S));
=============================================================================

c语言基础学习09_关于复合类型的复习的更多相关文章

  1. c语言基础学习09_复合类型

    =============================================================================涉及到的知识点有:一.结构体1.定义结构体st ...

  2. C语言基础学习基本数据类型-int类型与int变量

    int类型与int变量 针对不同的用途,C语言提供了多种整数类型.各种整数类型的区别在于所提供数值的范围,以及数值是否可以取负值. 在之前的实例中你已经看到过,int关键字用于声明整型变量. int类 ...

  3. C语言基础学习基本数据类型-Char类型

    char类型 char类型用于储存字母和标点之类的字符.但是在技术实现上char却是整数类型.为了处理字符,计算机使用一种数字编码,用特定的整数表示特定的字符.字符变量输入输出用%c符号.定义语法如下 ...

  4. c语言基础学习08_关于内存管理的复习

    =============================================================================对于c语言来讲,内存管理是一个很重要的内容,它 ...

  5. D02-R语言基础学习

    R语言基础学习——D02 20190423内容纲要: 1.前言 2.向量操作 (1)常规操作 (2)不定长向量计算 (3)序列 (4)向量的删除与保留 3.列表详解 (1)列表的索引 (2)列表得元素 ...

  6. D03-R语言基础学习

    R语言基础学习——D03 20190423内容纲要: 1.导入数据 (1)从键盘输入 (2)从文本文件导入 (3)从excel文件导入 2.用户自定义函数   3.R访问MySQL数据库 (1)安装R ...

  7. Golang 汇编asm语言基础学习

    Golang 汇编asm语言基础学习 一.CPU 基础知识 cpu 内部结构 cpu 内部主要是由寄存器.控制器.运算器和时钟四个部分组成. 寄存器:用来暂时存放指令.数据等对象.它是一个更快的内存. ...

  8. Swift语言指南(七)--语言基础之布尔值和类型别名

    原文:Swift语言指南(七)--语言基础之布尔值和类型别名 布尔值 Swift有一个基本布尔类型,叫做布尔(bool),布尔值又称逻辑值(logical),因为它只能为真(true)或假(false ...

  9. D01-R语言基础学习

    R语言基础学习——D01 20190410内容纲要: 1.R的下载与安装 2.R包的安装与使用方法 (1)查看已安装的包 (2)查看是否安装过包 (3)安装包 (4)更新包 3.结果的重用 4.R处理 ...

随机推荐

  1. Java 本地开发环境搭建(框架采用 Spring+Spring MVC+Hibernate+Jsp+Gradle+tomcat+mysql5.6)

    项目搭建采用技术栈为:Spring+Spring MVC+Hibernate+Jsp+Gradle+tomcat+mysql5.6 搭建环境文档目录结构说明: 使用Intellj Idea 搭建项目过 ...

  2. ucore lab1练习2 qemu+gdb 不能协作调试的问题make lab1-mon

    本练习是qemu结合gdb调试,但是我做实验的时候并不能像视频输入make lab1-mon那样顺利调试,期间有各种error,后来我找到原因,请看解决方法. 请先把ucore_lab文件删除,以下全 ...

  3. Pashmak and Flowers

    Pashmak decided to give Parmida a pair of flowers from the garden. There are nflowers in the garden ...

  4. BeanShell Sample与控制台交互

    应用的场景:业务当中涉及到一些敏感信息,如验证码,银行卡密码等或是动态变化的,不能直接写在脚本中,就需要通过控制台手动输入 如密码已键盘的方式输入,在控制台中以密码的方式显示 处理方法:添加 bean ...

  5. unity图片后期处理

    处理算法如下,在Start方法中分别调用想要的效果就行了.其中,将你需要处理的 图片 拖拽到 image参数上.注意,如果想要图片保持原来的尺寸不被压缩,需要更改图片的导入设置如下图,主要的Textu ...

  6. 删除SVN版本信息的两种方式

    一.在linux下删除SVN版本信息 删除这些目录是很简单的,命令如下 find . -type d -name ".svn"|xargs rm -rf 或者 find . -ty ...

  7. webpack之loader实践

    初识前端模板概念的开发者,通常都使用过underscore的template方法,非常简单好用,支持赋值,条件判断,循环等,基本可以满足我们的需求. 在使用Webpack搭建开发环境的时候,如果要使用 ...

  8. LeetCode题目总结(二)

    我的代码在github上,https://github.com/WINTERFELLS/LeetCode-Answers 这里只提供个人的解题思路,不一定是最好的. Problems 21-40 合并 ...

  9. MNIST-NameError: name ‘input_data’ is not defined解决办法

    在学习TensorFlow文档教程的时候, 在MNIST入门一节,发现直接运行下载MNIST数据集的代码会报错.原代码如下: import tensorflow.examples.tutorials. ...

  10. 我的Python学习笔记(二):浅拷贝和深拷贝

    在Python中,对象赋值,拷贝(浅拷贝和深拷贝)之间是有差异的,我们通过下列代码来介绍其区别 一.对象赋值 对象赋值不会复制对象,它只会复制一个对象引用,不会开辟新的内存空间 如下例所示,将test ...