C语言
数据类型
在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
类型 | 描述 |
---|---|
基本类型 | 它们是算术类型,包括两种类型:整数类型和浮点类型。 |
枚举类型 | 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。 |
void 类型 | 类型说明符 void 表明没有可用的值。 |
派生类型 | 它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型。 |
数组类型和结构类型统称为聚合类型。函数的类型指的是函数返回值的类型。
整数类型
类型 | 存储大小 | 值范围 |
---|---|---|
char | 1 字节 | -128 到 127 或 0 到 255 |
unsigned char | 1 字节 | 0 到 255 |
signed char | 1 字节 | -128 到 127 |
int | 2 或 4 字节 | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |
unsigned int | 2 或 4 字节 | 0 到 65,535 或 0 到 4,294,967,295 |
short | 2 字节 | -32,768 到 32,767 |
unsigned short | 2 字节 | 0 到 65,535 |
long | 4 字节 | -2,147,483,648 到 2,147,483,647 |
unsigned long | 4 字节 | 0 到 4,294,967,295 |
浮点类型
下表列出了关于标准浮点类型的存储大小、值范围和精度的细节:
类型 | 存储大小 | 值范围 | 精度 |
---|---|---|---|
float | 4 字节 | 1.2E-38 到 3.4E+38 | 6 位小数 |
double | 8 字节 | 2.3E-308 到 1.7E+308 | 15 位小数 |
long double | 16 字节 | 3.4E-4932 到 1.1E+4932 | 19 位小数 |
void 类型
类型|描述 函数返回为空|C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status); 函数参数为空|C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void); 指针指向 void|类型为 void * 的指针代表对象的地址,而不是类型。
笔记
常用基本数据类型占用空间(64位机器为例)
- char : 1个字节
- int :4个字节
- float:4个字节
- double:8个字节
基本类型书写
- 整数
- a,默认为10进制 ,10 ,20。
- b,以0开头为8进制,045,021。
- c.,以0b开头为2进制,0b11101101。
- d,以0x开头为16进制,0x21458adf。
小数
- 单精度常量:2.3f 。
- 双精度常量:2.3,默认为双精度。
- 字符型常量
- 用英文单引号括起来,只保存一个字符'a'、'b' 、'*' ,还有转义字符 '\n' 、'\t'。
- 用英文的双引号引起来 可以保存多个字符:"abc"。
- 整数
变量
按作用域可以分为:
- 全局变量
- 局部变量
按变量的存储方式:
- 静态变量
- 自动变量
- 寄存器变量 (寄存器:CPU内部用来存放数据的一些小型存储区域)
函数
指针
- 表示一些复杂的数据结构
- 快速的传递数据
- 使函数返回一个以上的值
- 能够直接访问硬件
- 能够方便的处理字符串
- 是理解面向对象语言引用的基础
定义
- CPU - 内存
- CPU 和 内存之线有三类线路
- 控制线
- 数据线
- 地址总线
- 地址总线(Address Bus)是一种计算机总线,是CPU或有DMA能力的单元,用来沟通这些单元想要访问(读取/写入)计算机内存组件/地方的物理地址。
- 一个单元位址线可以控制两个内存地址,而一个32位单元位址总线可以寻址到 4,294,967,296(2的32次方) = 4GB 的位址。
- CPU 和 内存之线有三类线路
- 地址
- 内存单元的编号 (一个单元是8个bit, 也就是1个字节)
- 从零开始的非负整数
- 范围:32位单元位址总线可以寻址到 4GB 的位址。
- 指针
- 指针就是地址,地址就是指针
- 指针变量就是存放内存单元编号的变量
- 指针和指针变量是不同的概念。但是我们通常把指针变量简称指针。
- 指针是一个操作受限的非负整数 (只能相减)。
分类
- 基本类型指针:
int * p
; - 指针和数组
- 指针和一维数组
- 数组名:一维数组名是个指针常量(常量不能赋值),它存放的是一维数组第一个元素的地址
- 指针和下标的关系:
a[5]; a[i] == *(a+i)
- 指针变量的运算
- 不能相加,不能相除,也不能相乘
- 如果两个指针所指向的是同一块连续存储空间中的不同存储单元,则这两个指针变量才可以相减
- 一个指针占几个字节
- 一个变量的指针,只使用变量第一个字节的地址(例如 int 占4个字节,int 变量的指针是第一个字节的地址)
- 一个指针在32位的计算机上,占4个字节, 一个指针在64位的计算机上,占8个字节
- 指针和二维数组
- 指针和一维数组
- 指针和函数
- 指针和结构体
- 多级指针
- 动态内存分配
- 传统数组(静态数组)的缺点
- 数组的长度必须事先约定,只能是常量,不能是变量
- 无法手动释放 (数组定义后,所占的内存空间无法手动释放,除非数组所在的函数终止)
- 数组的长度无法在函数运行的过程中动态的改变
- 函数终止后的访问限制(A函数中的数组,在A函数执行期间可以被其它函数访问,A函数终止后,就不能被其它函数使用)
- 为什么需要动态分配内存
- 解决静态数组的四个缺点
- 动态内存和静态内存比较
- 静态内存是由系统自动分配,由系统自动释放
- 静态内存是在栈分配的
- 动态内存是由程序员手动分配,手动释放
- 动态内存是在堆分配的
- 传统数组(静态数组)的缺点