c 用指针管理内存,内存管理和数据解构算法都离不开指针
内存管理
算法/数据结构
机器语言 -》 汇编语言 -》 FORTRAN 语言、Pascal语言(Delphi)、Basic语言(Visual Basic)、 C语言(C++ 、Java)
c 最早始是编写Unix内核的,现在主要用于做底层开发和嵌入式等
c | js --|--|--| c语言是编译型语言 | js 是解释性语言 c语言要借助编译器转换成可执行程序| js需要借助解释引擎运行
Windows | Linux/unix | Mac --|--|--|--|--|-- visual C++/MingWin | gcc/g++ | Xcode/gcc
nginx 为例,复制下载链接(pgp格式)
写一个c文件 hello.c
执行编译
CPU 的指令集
CPU 的组成
控制器(控制单元)
发出控制指令
运算器(运算单元)
二进制加法(只做加法)
存储器(存储单元)
存放要计算的数据和计算结果
通用寄存器
处理数据和指令
内部通信寄存器
控制数据总线(通过数据总线传送信息)
本源: 二进制数据
第一代语言:机器指令(痛苦指数 *****)
纸带上打孔(光电设备读取)
第二代语言:汇编指令(痛苦指数 ****)
助记符 + 伪指令
第三代语言:高级语言(主要特征:面向过程)
更符合人类思维习惯,比较好用了
第四代语言:面向对象语言(面向互联网、天然支持数据库)
linux 安装 nasm
nasm -f elf64 a.asm
ld a.o -o a
执行 ./a
输出 Hello world
天生的系统级语言
最早用来编写 unix 内核
曾经最流行的语言
至今仍在不断发展
c++ 是新的编程语言,并不是 c 的扩展,但是兼容c
c 是面向过程的, C++ 是面向对象的
c 和 C++ 都有标准库
目前 c 大多用在网络相关和嵌入式等方面
目前 c++ 大多用在复杂引擎和应用软件方面
c 内存处理手动
c++ 半手动
go Gc
rust 手动 + Gc
内存与内存地址
内存类似一个大的一维数组,包涵若干个存储单元(1Byte = 8bit)
内存地址用16进制表示 如 0x20e958
指针、地址与引用
指针:一个变量,保存内存存储的地址。即保存地址的变量。 在32位系统中 占用 4个字节,在64 位系统中占 8个字节。这就是为啥 32位程序小于64位程序。
地址:如 0x20e958
引用:对指针的一个封装
指向变量的指针
指针表示方式
指向指针的指针
指向函数的指针
动态内存分配
指针可以进行加减运算,不能做乘除运算
指针和内存
每块内存都有2个部分,地址和值。 一级指针的值,对应着指针指向的值的地址 二级指针的值,对应着一级指针的地址
动态申请内存
内存 4 区
栈区(内存会自动获取自动释放)
是一个确定的常数(1-2M)不同平台大小不同,超出会提示 stackoverflow
堆区(内存需要手动申请、释放)
用于动态内存分配
全局区或静态区(只初始化一次)
在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)
程序代码区(代码区的指令中包括操作码和要操作的对象(或对象引用地址))
代码区指令根据程序设计流程依次执行,对于顺序指令,对于顺序指令,则只会执行 一次(每个进程),如果反复,则需要使用跳转指令,如果进行递归,则需要借助栈 来实现
我们在平时使用的时候,只能操作 栈区、堆去、全局静态区,如果操作程序代码区,就会 发生保护性错误。