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 的位址。
  • 地址
    • 内存单元的编号 (一个单元是8个bit, 也就是1个字节)
    • 从零开始的非负整数
    • 范围:32位单元位址总线可以寻址到 4GB 的位址。
  • 指针
    • 指针就是地址,地址就是指针
    • 指针变量就是存放内存单元编号的变量
    • 指针和指针变量是不同的概念。但是我们通常把指针变量简称指针。
    • 指针是一个操作受限的非负整数 (只能相减)。

分类

  • 基本类型指针: int * p;
  • 指针和数组
    • 指针和一维数组
      • 数组名:一维数组名是个指针常量(常量不能赋值),它存放的是一维数组第一个元素的地址
      • 指针和下标的关系: a[5]; a[i] == *(a+i)
      • 指针变量的运算
        • 不能相加,不能相除,也不能相乘
        • 如果两个指针所指向的是同一块连续存储空间中的不同存储单元,则这两个指针变量才可以相减
      • 一个指针占几个字节
        • 一个变量的指针,只使用变量第一个字节的地址(例如 int 占4个字节,int 变量的指针是第一个字节的地址)
        • 一个指针在32位的计算机上,占4个字节, 一个指针在64位的计算机上,占8个字节
    • 指针和二维数组
  • 指针和函数
  • 指针和结构体
  • 多级指针
  • 动态内存分配
    • 传统数组(静态数组)的缺点
      • 数组的长度必须事先约定,只能是常量,不能是变量
      • 无法手动释放 (数组定义后,所占的内存空间无法手动释放,除非数组所在的函数终止)
      • 数组的长度无法在函数运行的过程中动态的改变
      • 函数终止后的访问限制(A函数中的数组,在A函数执行期间可以被其它函数访问,A函数终止后,就不能被其它函数使用)
    • 为什么需要动态分配内存
      • 解决静态数组的四个缺点
    • 动态内存和静态内存比较
      • 静态内存是由系统自动分配,由系统自动释放
      • 静态内存是在栈分配的
      • 动态内存是由程序员手动分配,手动释放
      • 动态内存是在堆分配的

results matching ""

    No results matching ""