一、指针是什么?
1.1、指针理解的2个要点
①、指针是内存中一个最小单元的编号,也就是地址。
②、平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量。
1.2、指针变量
创建变量的本质是向内存中申请一块空间。
通过&取出变量的内存真实地址,把地址可以存放到一个变量中,这个变量就是指针变量。(存放在指针中的值都被当成地址处理)
#include <stdio.h>
int main()
{
int a = 10; //在内存中开辟一块空间
int* p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
//a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量
//中,p就是一个之指针变量。
return 0;
}
在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个
字节。那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。
总结:指针的大小在32位平台是4个字节,在64位平台是8个字节,指针变量的大小与类型无关。
二、指针和指针变量
2.1、指针的解引用
2.2、指针+-整数
三、野指针
3.1、野指针的成因
1、指针未初始化:
int main()
{
int* p; //p里面放的是随机值
*p = 20;
return 0;
}
2、指针的越界访问:
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0; i <= 11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
}
3、指针指向的空间未释放
3.2、如何规避野指针
1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放,及时置NULL
4. 避免返回局部变量的地址(避免返回栈空间地址)
5. 指针使用之前检查有效性
四、指针的运算
4.1、指针+-整数
4.2、指针的关系运算
标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前
的那个内存位置的指针进行比较。
4.3、指针-指针
五、指针和数组
六、二级指针
七、指针数组
指针是数组,是存放指针的数组。