一、指针类型
1、指针类型的详情
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
以int *pi =&n;为例,pi是指针变量,int*是变量类型,存放的是&n(n的地址),相对应的n应该为int类型,因为int*类型的指针存放的是int类型的变量地址,其他类型同理。
2、指针类型对解引用的影响
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
字节数 | short | unsigned int/int | unsigned long/long | float | double | char | long long | 指针 |
---|---|---|---|---|---|---|---|---|
16位 | 2 | 2 | 4 | 4 | 8 | 1 | 8 | 2 |
32位 | 2 | 4 | 4 | 4 | 8 | 1 | 8 | 4 |
64位 | 2 | 4 | 8 | 4 | 8 | 1 | 8 | 8 |
如图所示:为各种变量类型所占字节情况图,对应类型的指针在解引用时所能访问的字节数,比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
例题:
解:因为地址存储是倒置的,则访问时为44332211。因为pc的类型为char*所以解引用时每次只能访问一个字节,而地址两位十六进制为一个字节,则只改变了44输出11223300(输出不是倒置)。
二、野指针
1、概念
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。
2、野指针的成因
1. 指针未初始化
顾名思义创建是直接写 int *p; //局部变量指针未初始化,默认为随机值
应写为 int *p = &n
2. 指针越界访问
例:
#include <stdio.h>
int main()
{
int arr[10] = {0};
int *p = arr;
int i = 0;
for(i=0; i<=11; i++)
{
/ /数组arr只有10个元素下标0-9,而 i 超出了9,当指针指向的范围超出数组
*(p++) = i; arr的范围时,p 就是野指针。
}
return 0;
}
3. 指针指向的空间释放
例:
指针指向的空间释放常见于函数调用中,因为函数内创建的变量为临时变量,在return&a时确实能返回a的地址,但调用完函数后该地址会释放掉返还给系统,所以此时int*p里面的地址是不属于任何对象。
3、如何规避野指针
1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放即使置NULL
在不使用指针时,把他置NULL(int *p = NULL),但置NULL后不得解引用操作(*p=20),需要时再把他指向地址(p=&n)才可以解引用操作。