一.内存
1.内存的含义:
内存是沟通CPU和硬盘的桥梁:
(1)暂存CPU中的运算数据
(2)暂存与外部存储器交换的数据
物理存储器:实际存在的具体存储器芯片
主板上装插的内存条
显示卡上的显示RAM芯片
各种适配卡上的RAM芯片和ROM芯片
存址空间:对存储器编码的范围。我们在软件上常说的内存是指这一层含义
(1)编码:对每个物理存储单元(一个字节)分配一个号码
(2)寻址:可以根据分配的号码找到相应的存储单元,完成数据的读写
理解:可以将内存 抽象理解为一个超大的一维字符数组,通过下标(对每个字节分配的号码-与操作系统有关,例如 操作系统为32位,号码就是32位的编号)
拓展:现在可以理解为什么系统会影响内存的性能,32位操作系统寻址范围 就是 2的32次方也就是4G 所以最大内存为4G
指针和指针变量:
(1)内存中每一个字节都有自己的编号,这就是“地址”
(2)如果程序中定义了一个变量,程序运行或者编译时,系统就会给这个变量分配内存单元,并确定他的地址(编号)
(3)指针实质就是内存“地址”。指针就是地址,地址就是指针
(4) 指针是内存单元的编号,指针变量是存放地址的变量
关于野指针,空指针,万能指针大家可以去找些资料,这里只贴代码,不做解释
此处强调一下 ,将NULL赋给指针,此指针就被称为空指针,因为NULL是一个值为0的宏常量
什么是宏?
(百度百科)宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。这种替换在预编译时进行,称作宏展开。
二:const修饰指针变量
const 限定一个变量不允许被改变,产生静态作用
用const修饰变量是不安全的 (可以通过高一级指针修改)
const int * i = &a 等价于 int const * i = &a 此时const修饰的是 int * ,所以 *i 是不允许赋值 ,也就是不能间接修改a的值,但是指向地址可以 修改 如 i = &b
int * const i = &a 此时const修饰的是 变量 i ,所以i 指向的地址不能修改,但是 *i = 200 可以通过,也就修改了a 的值
const int * const i = &a 值和地址都不能修改
三:指针和数组
int [] i = {1,2,3,4,5};
i 为数组第一个元素的地址,但他是一个常量
i = 10 ; // 发生错误,因为虽然 i 指向元素地址,但是i是一个常量
sizeof() 方法 ,判断占用多少字节
四:指针加减运算
指针的加减运算不像我们所想到加减
如果一个 int * ,+1的结果就是增加了一个int 类型大小 -----int * i = 20; i = i+1; 就是原地址移动4位
如果是一个char *,+1的结果是增加一个char大小 -------- ...
什么类型 * + 1 就移动原地址一个类型位 (指针乘除没有意义)
五:多级指针
C语言允许有多级指针存在,在实际的程序中一级指针最常用,其次是二级指针。
二级指针就是指向一个一级指针变量地址的指针,三级......
int a = 1;
int * b = &a; //一级指针,指向a的地址
int **c = &b; // 二级指针,指向b的地址 ,*c 就是 b , *cc 就是 a
int ***d = &c; //三级指针,指向c的地址,*d就是c,**d就是b,***d就是a