下面我将从
1、指针是什么
2、指针类型
3、野指针
4、指针运算
5、指针和数组
6、二级指针
7、指针数组
这几个方面大体讲一下今天的内容:
1、指针是什么
指针是个变量,使用来存放内存单元的地址(存放在指针中的值被当做地址来处理)
#include<stdio.h>
int main()
{
int a=20;
int* p=&a;
printf("%p\n",p);
return 0;
}
上面的运行结果就是a的地址,而且我们可以看到a的地址是16进制,对于16进制两位就可以表示一个字节,所以该地址一共8个字节
这是因为指针大小在32位平台是4个字节,在64位平台是8个字节(对于这个的理解:在32位上地址位2^32,所以为4个字节,同理64位8个字节)
2、指针的类型
让我们先来看下面一段代码:
由运行结果可以看不管是int*还是char*他们都可以存储a的地址,int的大小不是4个字节吗?char的大小不是1个字节码,而他们为什么都可以存储a的地址呢?
下面再让我们看一段代码:
由上面的代码可以看出不管是什么类型的指针都是4个字节,这就是为什么char*完全可以存储a的地址了
那现在又有疑问了:既然这些指针的大小都一样,那他们的类型还有什么意义呢?、
这是因为指针的类型决定了指针进行解引用操作时,能够访问的空间大小(能操控几个字节)
int* p能够访问4个字节
char* p能够访问1个字节
double* p能够访问8个字节
上面的代码可以看出:*p=0;可以使4个字节的a改变大小,而*j=0;却不能将4个字节的b变成0,就是因为j的类型是char*,他只能够访问b地址中的一个字节并将其改成0,但其他3个字节却不能改变
3、野指针
野指针就是指针指向的位置是不可知的(随机的、不正确的)
什么样的指针是野指针?
在编写上述代码时没有给指针p赋初值,所以该指针所指向的空间是位置的,在运行程序的时候会出错
当i=9时此时指针p指向arr[10]的地址,而当i=10时,指针就指向了arr[11],此时数组的下边越界,导致指针p所指向的空间是随机的
上面这个代码也是野指针:因为在函数体中虽然返回了a的地址,但a是局部变量,所以在执行完函数后a的地址就会被释放,而在main中对p进行解引用,导致p所指向的空间是随机值
综上所述
1、指针未初始化
2、指针越界
3、指针指向的空间释放
都会造成野指针的出现,所以在用指针时,我们应该牢记:
1、指针初始化(如果不知道指针的初始值,就给其赋值NULL)
2、小心指针越界
3、指针指向的空间释放,就给其指针赋值NULL
4、指针使用之前检查有效性