指针为什么要定义类型
指针的类型不并能决定指针指向的是一个什么类型的数据
指针就是个变量,用于存放内存地址。地址的唯一作用是标识一块内存空间的。在这块内存空间里放什么类型数据都是可以的。来看看以下代码段:
int main()
{
int a = 0x11223344; //假定变量a在内存中的存储地址为0x00000000
int* p1 = &a;
char* p2 = &a;
double* p3 = &a;
printf("%p\n", p1); // 输出结果为0x00000000
printf("%p\n", p2); // 输出结果为0x00000000,这里注意,编译会告警,但是不会报错
printf("%p\n", p3); // 输出结果为0x00000000,这里注意,编译会告警,但是不会报错
return;
}
在不对内存进行操作的情况下,使用不同类型的指针都可以用在存储变量int a的地址(当然,也可以用来存储任意的其他类型)。
指针的类型决定了对指针解引用时,一次访问的空间大小
int *p
解引用时,一次访问4个字节的地址char *p
解引用时,一次访问1个字节的地址double *p
解引用时,一次访问8个字节的地址- 其他的类型逻辑都是相同的…
指针的类型决定了指针移动时的步长
来直接看看代码吧:
int main()
{
int a = 0x11223344; //假定变量a在内存中的存储地址为0x00000000
int* p1 = &a;
char* p2 = &a;
double* p3 = &a;
printf("%p\n", p1+1); // 输出结果为0x00000004,int* 一次跨越4字节地址
printf("%p\n", p2+1); // 输出结果为0x00000001,char* 一次跨越1字节地址
printf("%p\n", p3+1); // 输出结果为0x00000008,double* 一次跨越8字节地址
return;
}
避免出现野指针
概念:野指针说的是指针的位置是不可知的(随机的、不明确、没有限制)
出现野指针的原因
-
指针未初始化
int main() { int *p; //局部变量指针未初始化、默认为随机值 *p = 10; return 0; }
-
指针越界访问
int main() { int arr[3] = {0}; int* p = arr; for(int i = 0;i<5;i++) { *(p+1) = 1; // 指针访问范围超出arr数组范围时,P就是野指针 } }
-
指针指向的空间被释放
int* test() { int a = 10; return &a; // 函数结束时,所占的空间会被系统回收 } int main() { int *p = test(); // 方法返回的地址实际上已经被操作系统回收,int *p变成了野指针 *p = 20; return 0; }
如果避免野指针
- 指针声明即初始化
- 小心指针越界
- 指针指向空间被释放时,让指针指向NULL
- 使用指针前,检查有效性