目录
指针就是地址,口语中的指针指得是指针变量
一.内存
1.内存如何进行编号?
电脑常见有32位和64位
电脑32位和64位地址线是物理线,可以通电,会产生1和0的电信号,电信号转换为数字信号(由1和0组成的二进制序列),由不同的排列进行编号
2.一个内存单元是多大空间?
列如,32位
2的32次方内存单元
2^32=4294967296 bit
/8=536870912 byte
/1024=524288 kb
/1024=512 mb
/1024=0.5 gb
无论多少位的计算机,一个内存单元都是一个字节
二.指针
a在内存中要分配空间的4个字节
pa是用来存放地址的,pa叫做指针变量
*说明pa是指针变量,int说明pa执行的对象是int类型的
(char ch='a';
char*pa=&ch;)
%p专门用来打印地址
*解引用操作,*pa就是通过pa里的地址找到a,可以通过*pa改变a中的值
三.指针的大小
指针的大小是相同的,在32位平台是4个字节,在64位平台是8个字节
指针需要多大空间取决于地址的储存需要多大空间
四.指针和指针类型
指针的定义方式
type+*+指针名
char *p=NULL
int *p=NUll
short *p=NULL
long *p=NULL
float *p=NULL
double *p=NULL
指针类型的意义:
1.指针类型决定了:指针解引用的权限有多大(能操作几个字节)
列如char*的指针解引用只能访问一个字节,而int*的指针解引用可以访问四个字节
p解引用访问的大小是sizeof(type)个字节
2.指针类型决定了:指针走一步,能走多远
整型指针+1跳过四个字节
字符型指针=1跳过一个字节
type *p
+/- n
跳过n*sizeof(type)个字节
五.野指针
野指针就是指针指向的位置是不可知的(随机的,不确定的,没有明确限制的)
指针未初始化
p是一个局部的指针变量,局部变量不初始化的话默认是随机值
*p=10;非法访问
这里的p就是一个野指针
越界访问
当进行for循环,指针指向的范围超过数组arr的范围时,p就是一个野指针
指针指向的空间释放
这里的变量a进入函数创建,退出函数销毁,指针变量p指向a的空间就是野指针
如何避免野指针
指针初始化
当不知道p应该初始化为什么值时,直接初始化为NULL int*p=NULL;
明确知道什么值时 int a=10;int *p=&a;
小心指针越界
指针指向的空间释放及时指NULL
指针使用之前检查有效性
判断有效性的前提是对指针进行初始化
指针运算
指针+-整数
指针加减整数的意义在于指针在数组中位置的移动
指针+1并不是在指针地址的基础上+一个地址,而是+一个元素所占的字节数
列如
int*指针,1代表4个字节地址
char*指针,1代表1个字节地址
通用公式
p +/- n 代表p的基地址+/-n*sizeof(type)个字节地址
如初始化数组
指针-指针
前提 两个指针指向同一个空间
指针-指针得到的是两个指针之间的元素个数
实现strlen函数
指针之间的关系运算
标准并不保证可行
标准规定 :允许指向数组元素的指针与指向数组元素后面的那个内存位置的指针作比较,但是不允许与指向数组第一个元素前的位置指针作比较
指针和数组
数组名是数组首元素的地址
有两个例外
1.sizeof(数组名),数组名指的是整个数组
2.&数组名,数组名指的是整个数组
既然数组名是地址,那么我们就可以用指针来访问数组
二级指针
int a=10;
int *pa=&a; pa是指针变量,一级指针
int **ppa=&pa; ppa也是一个变量,二级指针变量
pa中存放着a的地址,pa是一个一级指针变量,ppa中存放着pa指针变量的地址,ppa就是一个二级指针变量
存放指针地址的变量称为二级指针,以此类推我们可知三级指针,,,
指针数组
存放着指针的数组,本质还是数组
int*par[5]
char*pcr[5]