指针——初阶
哈喽!这里是我的第一篇博客,将在这里记录我学习的过程。
1.指针是什么?
指针就是地址,口语中所说的指针,说的是指针变量。
2.如何编址?
在32位机器上,有32根地址线,每根地址线都有”0“和”1“两种情况,可以产生2^32个地址编号,每个地址编号都代表着1byte。 内存有2^32byte/1024/1024/1024=4GB。
同样的,在64位机器上,有64根地址线,可以产生2^64个地址编号。 内存有2^ 64byte/1024/1024/1024=2^ 32*4GB。
注意:地址在内存中存储在指针变量里时,由于二进制数太长,因此用十六进制数代替二进制数进行存储,且1个十六进制位=4个二进制位。
3.指针类型的意义
(1).指针类型进行解引用操作的权限不同。
(2).指针±整数的步长不同。(即移动指针的时候,移动的最小步长不同。)
注意:标准规定,允许指向数组的指针与指向数组最后一个元素后面那个内存位置的指针进行比较,不允许与指向数组首元素之前的那个内存位置的指针比较。
4.指针的运算
(1).指针±整数
int arr[3]={1,2,3};
int* p=arr;
p++;
在运行到第二行代码时,p指向的是arr[0],p++以后,p指向arr[1]。
(2).*p±整数
解引用 * 操作符的优先级比较低,p会先和±结合,即*p±整数,会先将p±整数,在对移动后的指针进行解引用操作 * 。
*p++;
//可拆解为
*p;
p++;
(3).指针–指针
指针-指针计算的是指针之间的元素个数,前提条件是两个指针都指向同一块连续的内存。
关于野指针
指向位置不可知的指针称为野指针。
1.野指针的成因
(1).指针未初始化。
(2).指针越界访问。
(3).指针指向的空间被释放。
2.如何规避野指针
(1).指针使用时,必须初始化。
(2).避免指针越界访问。
(3).避免返回局部变量地址。(栈空间)
(4).指针指向的空间被释放时,及时置空NULL。
(5).指针使用之前检查有效性。