C语言部分学习笔记整理




———————————内存—————————
——计算机程序运行的实质
处理数据的到一定的结果

——哈弗&&冯诺依曼结构
冯诺依曼结构:代码和数据统一存放
哈佛结构:代码和数据分开存放

代码:代码是死的 存在计算机中(flash )函数??
数据:全局变量 局部变量 需要存放在内存中ram中


_DRAM SRAM
动态ram 静态ram Dram 需要初始化
Sram 不需要初始化

——为什么程序运行需要内存?
程序运行需要数据 数据是存放在内存中的所以内存是程序运行的本质需求

——如何管理内存??
从操作系统角度来讲
有操作系统
操作系统管理硬件的所有内存,它是将内存分割成一个一个的快进行管理,这方面的管理十分复杂,我们需要开辟内存是只需要调用相应的API即可例如(malloc)(free)
无操作系统
无操作系统就是逻辑程序,我们使用内存需要自己动手去指定比如(0x d002 0010)

从语言角度来讲:
汇编语言
就和逻辑差不多
C语言
内存管理利用(malloc)(free) 其实给内存管理了一些封装
C++ ----
C#,Java:
都不用直接管理 有虚拟机(狗腿子)帮助管理 内存的开辟和释放

位 的逻辑 字 半字位宽
什么是内存?(硬件和逻辑两个角度)
从硬件角度:
其实就是计算机内部的一个硬件组成比如(一般叫内存条)按照原理分成 ——SRAM DRAM
从逻辑角度:
它是那么一种东西可以随机访问,这就表示了它与变量的配合,即可读可写,它在计算机中存储数据,表现为一个一个的单元格子,这一个一个的格子有它自己的编号,里面可以存放数据。 (变量)


内存的逻辑抽象图(内存的编程模型)
就相当于一个一个的楼房,楼房里有许多的房间,地址就相当于房间号,我们访问这些房间的时间就可以用这些房间号去访问房间的存放的东西。
逻辑上的内存大小

逻辑上内存的大小应该是无穷无尽的,因为数学的编号是无穷的,但是在32位机中,内存的大小应该<= 4G
且每个内存的地址(房间编号)都应该是与它本身绑定的,不可改变的,我们访问这个编号就相当于进了这个房子。(固定地址)


内存位宽
内存的位宽有8bit 16bit 但是8bit并联可以实现32bit 的内存。(一般内存条都是许多芯片并联而成)
位和字节
内存单元的大小单位有四个: 位:1bit 字节:8bit 字:32bit 半字: 16bit(字的大小定义是十分混乱的 所以应该对照响应的平台而定而Linux + ARM 一个字就是32bit)
内存编址,寻址,内存对齐(十分本质重要)
内存编址是以字节为单位的也就是8bit:
内存对齐
内存对齐访问,在硬件上就是效率高

内存管理之结构体
结构体是如何管理内存的?结构体也就是在内存中开辟除了一块定义的内存;

数据结构:如何组织数据(在内存中如何排布)
最简单的数据结构:数组 (就是一块数据类型相同的数据类型的集合)
数组的优势和缺陷
优势:使用起来简单方便
缺点:1:数组的数据结构都是相同的(类型)

2:数组的大小在定义时就要给出 a[10]

结构体struct
struct ages
{
int ages;
char name[20] ;
int high;
};

面向过程和面向对象
C语言就是面向过程的,但是用C语言编写的Linux内核是面向对象的,所以可以用C语言实现类,实现面向对象;(结构体内嵌指针来实现面向对象)

结构体内嵌指针实现面向对象
结构体实现面向对象就是实现class 有成员变量。有成员方法 -> 类比 C语言中的变量和函数(函数就是实现方法);
struct ages
{
int a;
void (*pFunc)(void); //函数指针也属于变量
};

内存管理之结构体
结构体是如何管理内存的?结构体也就是在内存中开辟除了一块定义的内存; struct





内存管理之栈:(stack)
栈:是一种数据结构在C语言中用来管理局部变量;栈发明是用来管理内存的;
栈的先进后出
top 指针总是在最后改变的数据的上面,bottom 指针是在栈底不动的
栈的应用举例:
局部变量:局部变量比如 int a; 那么就是在栈中分配一块内存地址与变量a相关联,为是么在不给初始化的时间变量的值是不定的呢? 因为在栈中取出的数据只是拷贝一份传递出去,而它本身是不发生改变的,所以它的值是脏的,也就是所说的栈是脏的;
栈的优点:
栈对内存的管理十分方便,分配和回收内存都不需要程序员去操心;
栈的约束:类似于数组,栈的大小不好规定,且十分怕溢出。C语言中是不对栈进行溢出检查的,所以栈如果溢出就很麻烦。比如不能对局部变量这样定义:
int a[100000] ; 递归问题: 如果递归的话一定要注意递归收敛;否则在一次一次的递归中将损耗栈的内存,如果栈溢出则会产生麻烦的后果;

内存管理之堆
堆(heap)是一种内存管理方式.
堆这种管理系统的方式最大的特点是自由:可以随时通过API(malloc,free)这些接口去操作内存。

什么时间适合使用堆内存:需要内存较大的时间

内存泄漏
C/C++中使用malloc 不自己free 就会产生内存泄漏。就相当于程序在运行中,开辟了一段内存以后,没有释放。程序结束以后再次运行,又开辟一段内存,这就是内存泄漏,也就是吃内存。这是非常严重的bug ,我们必须避免;

C语言堆内存管理接口:
malloc
malloc(10 * sizeof(int));

复杂数据结构:
链表:是最重要的,链表在Linux内核使用中非常的多。驱动、应用编程很多时间都要用到链表、所以链表是必须掌握的。
哈希表:( 不常用,一般不需要自己写,只要能看懂,明白在什么时间需要用,人家为什么用,有没有更好的选择??)

数据结构和算法的关系?
数据和算法是相辅相成的,算法的实现依赖于数据,复杂算法的本质来源与生活中的各种问题,而这种问题依赖于复杂的数据类型去实现
我们所抱有的态度是在碰到的时间去详细研究,在某个领域有需要的去研究
在Linux内核中,比如在字符串驱动设备中,有许多哈希表的应用。我们在此情况下就需要去研究哈希表,因而明白为什么要中哈希表。尽管我们不需要自己去编写一个哈希表。因为大部分这种算法我们都是可以直接用现成的。

—————————————————————————————————位运算——————————

位运算符
&
|
^
按位异或:异或就是相异或操作
1^1 = 01^0 = 10^1 = 10^0 =0
可以发现某位和1异或就相当于对他进行取反
<<
>>
寄存器的操作理念就是
//(1)
对某位进行置1置0则对应一下算法:
将一个int型数 a 对它的bit3~bit7改写
(7-3+1) = 5 -> 1 1111 (对应的是5位为1)
然后将得到的这个数进行左移
(1F << 3)| a //将某个数的bit3~bit7置一
~(1F << 3)& a //将某个数的bit3~bit7置0
//

//(2)
将一个int型数 a 对它的bit3~bit8取出
算法如下:
(1) 先将所需要的数取出别的清零
(2) 然后将的到的数右移到低位
((3f<<3) & a) >> 3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值