目录
理解指针
1、指针是内存中一个最小单元的编号,也就是地址,大小为1Byte
2、平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量。
eg指针p
p是一个变量,用来存放地址
*p是p指向的对象
int*p=&a;
p=&b;
(int*只是一种定义p为指针的形式)
3、在32位的机器上,地址是32个0或者1组成二进制序列,地址就用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节(1Byte=8bit一个字节等于八个比特位)
在64位机器上,有64个地址线,一个指针变量的大小是8个字节,才能存放一个地址
使用指针
指针的解引用
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)
char*只能访问一个字节,int*能访问四个字节
指针的类型决定了指针向前或者向后走一步有多大(距离)
野指针
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针成因
1、指针未初始化
未初始化就放的是随机值
2、指针越界访问
3、 指针指向的空间释放
如何规避野指针
1. 指针初始化
如果明确知道指针应该指向哪里,就初始化正确的地址
如果不知道初始化什么值,安全起见初始化为NULL(0,空指针)
但是0作为地址时,这个地址是不允许用户程序去访问的,即不能放值进去
2. 小心指针越界
3. 指针指向空间释放即使置NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性
指针运算
指针运算时,指两个元素中间,参与运算的
是后面一个元素
使用指针打印数组的内容
p指向的是数组首元素
p+i 是数组中下标为i的元素的地址
p+i 其实是跳过了i*sizeof(int)个字节
指针减指针
前提是两个指针指向同一块区域且指针类型相同
减完结果是两个指针之间的元素个数,分正负
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,
但是不允许与指向第一个元素之前的那个内存位置的指针进行比较
数组名表示数组首元素的地址 但有两个例外
1、sizeof(数组名)
数组名单独放在sizeof内部表示整个数组,计算的是数组的大小,单位是字节
2、&数组名
数组名也表示整个地址,取出的是数组的地址,和首元素地址值一样,类型和意义不一样
二级指针
二级指针是用来存放一级指针变量的地址
指针数组
是存放指针(地址)的数组
与二维数组不同,二维数组地址是连续的