c基础补充

c与内存

        内存是用来存储程序的可变数据的。

        操作系统把内存分成页为单位管理,并给用户提供API接口,申请malloc,释放free。

        哈佛结构:程序和数据分开存放,如单片机,程序在ROM,数据在RAM;

        冯诺依曼结构:程序和数据存放在一起,如PC机;

        动态内存(需要初始化):动态内存则是在程序运行中进行分配的,如局部变量,动态内存在堆中。

        静态内存(无需初始化):是程序在编译时分配给变量的空间,变量从程序开始到结束,变量的地址都不会改变,在栈或堆中。

        c、c++内存管理需要用户自己申请,使用完后自己释放,如果忘记释放就会造成所谓的内存泄漏。

        java、c#则由虚拟机进行内存管理,用户直接使用,无需申请与释放。

内存位宽

  1. 内存单元大小、单位有:位(1bit)、字节(8bit)、半字(一般16bit)、字(一般32bit),一般是因为操作系统种类很多,他们把字的定义不同,没有统一标准。

“字”在不同硬件平台定义不同,32位单片机字的定义为32位。16位单片机定义为16位。int与字绑定。

内存的编址单位都是字节8bit;如0x1234任意地址都是1字节。

        int(整形):“整”说明一个完整的硬件的位宽;程序中定义的变量都是存放在内存的,内存是32位,那么定义类型为32位的变量使用效率最高。定义16位、8位效率较低。

例如我们定义bool型变量,实际编译器也是分配了32位。为了效率,牺牲浪费。

内存对齐

  1. 如32位宽的内存,地址0x1、0x2、0x3、0x4是一体,0x5、0x6、0x7、0x8是一体;

对齐访问:访问0x1、0x2、0x3、0x4或0x5、0x6、0x7、0x8

非对齐访问:0x3、0x4、0x5、0x6;这种方式硬件虽然允许,但效率非常低。

c语言对内存的操作

        假设1个地址看成1个格子,那么数据类型决定了一个类型的变量占用格子的数量,和这几个格子的组合或解析方法。

格子长度

        数据类型的其中一个含义就是规定数据占用的格子,如int i;编译器分配出4个字节,把首地址(编号只有编译器知道)与i绑定。

        数据类型定义的是内存格子长度,即数据类型决定了在内存中的长度,如:char 的内存长度为1个格子(8bit),实际是地址长度是1;int内存长度为4个格子,实际硬件上的内存地址长度是4;

格子组合与解析方法

        数据类型的另一个含义就是规定数据占用的多个格子的组合或解析方法,如int(4个格子)和float(4个格子),格子里存放的二进制还是不变,但是解析方法不同(4个格子的内容组合不同),int型解析单纯的将4个格子的数据进行组合,float则是认为其中部分格子表示整数其它的表示小数。强制类型转换其实就是改变了4个格子的解析方法

        c语言将一个函数使用的格子标记在一起,标记的这个区域格子就是这个函数的功能代码,函数名则是这个区域格子的首地址,所以函数名的本质就是一个首地址

        指针访问内存,指针类型与变量类型实际上是相同的,都是规定了格子长度和连续几个格子的解析(组合)方法。任何类型的指针变量本身所占用的内存永远为1个字(与硬件平台有关),如int * p代表这4个格子里是一个指针,是用来做指向的,他指向的数据类型是int(长度4,使用整数解析的方法),p++是基于类型加1,而不是地址加1,那么此处的p++则是地址加4。

数组管理内存

  1. 变量、函数、指针、数组都是对内存地址进行解析,只是解析的方法不同如:

int a  //编译器分配4个字节,把a与4个字节的首地址绑定。

int b[5] //编译器分配20个字节给b,把20个字节的首地址与b绑定。

数据结构

        数组可以看做是简单的结构体(成员类型相同的结构体),数组之所以能使用下标访问,是在于数组类型相同,编译器可以通过下标计算出其中元素的地址,而结构体成员类型不同即变量在内存中的长度不同,编译器无法通过首地址计算出其中成员的地址,因此需要指定到具体元素。

内存管理栈

(1)栈是栈,堆是堆,所谓堆栈指的就是栈。c语言中栈用来保存局部变量。

(2)栈-先进后出,FILO (first in last out),只有一个初入口,类似泡菜坛。

(3)队列-先进先出,FIFO(first in first out),进出口分开,类似塑料管子。

(4)栈的益出非常危险,因此我们在编程时要注意以下细节:

        a.局部变量不能太多,太大,例如table[10000],这种情况易导致栈益出。

        b.递归要注意收敛。

内存管理堆

        堆是一种内存管理方式,堆的使用容量不限,堆需要手工申请和释放,如果申请后不释放就会造成内存泄漏(吃内存)。是最严重的BUG。堆的释放:直接使用free;

堆申请有3种,malloc(size)、calloc(nmemb、size)、realloc(*ptr,size)

复杂数据结构

(1)、链表

(2)哈希表

(3)二叉树

(4)图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值