目录
关于指针的概念以及指针的大小请看这篇博客:写文章-优快云博客
https://mp.youkuaiyun.com/mp_blog/creation/editor/122291428
1.指针的类型
我们都知道一个变量是有类型的,如int型、 char型、float型。那么一个指针是否有类型呢?
我们可以这样思考一下:指针是用来存储变量的地址的,变量有不同的类型,那存储他们地址的指针也应该有不同的类型。
答案确实这样,指针有不同的类型。例:

这些都是不同的指针类型。我们可以总结以下 变量的类型 + * 就是指针的类型。
它们都有什么含义呢? 其实也很简单,如char* arr1,它的意思就是 arr1这个指针变量指向的数据类型为char型,也就是说char*类型的指针存放的是char类型变量的地址。当然了我这里将它们都初始化成了空指针。
2.指针类型的意义
前面我们讲过一个指针的大小取决电脑,在32位平台上指针的大小为4个字节,在64位平台上指针的大小为8个字节。看到这里可能会产生疑问,既然指针的大小是相同的为什么还要分为不同的类型呢?其实这是有意义的,并且作用非常大,看下面的例子:

这里可以看到 pc 和 pr 储存的地址是相同的,但是他们的类型不同,pr是char*类型而pc是int*类型,由③和⑤可以看到将pc pr各加一,他们跳过的字节数不同。这就是指针类型的意义,指针类型决定了指针向前或向后走一步有多大距离,当然也决定了在进行指针解引用是访问字节的权限。
3.野指针
概念:野指针是指针指向的位置不可知(随机的、不正确的、没有明确限制的)。
3.1野指针形成的原因
1.指针未初始化
#include <stdio.h>
int main()
{
int* p;//指针变量未进行初始化,变量里储存的地址是随机的
*p = 20;
return 0;
}
2.指针越界访问
#include <stdio.h>
int main()
{
int arr[5] = { 0 };
int* p = arr;
for (int i = 0; i <= 5; i++)
{
*(p + i) = i;//当i=5是超出数组arr的范围,p就是野指针了
}
return 0;
}
3. 指针指向的空间被释放
#include <stdio.h>
int main()
{
int* arr = (int*)malloc(10 * sizeof(int));//开辟一块空间
free(arr);
//把arr指向的空间释放掉,这时arr就指向未知,成为野指针;
//正确做法是将arr置为为空 arr=NULL
return 0;
}
3.2如何规避野指针
1.指针初始化
2.小心指针越界
3.指针指向的空间被释放后置为空(NULL)
4.避免返回局部变量的地址
5.使用指针前检查有效性
4.指针-指针
当两个指针指向同一块空间时,指针减指针得到的是两个指针之间的元素个数。
这里需要注意的是arr代表的是数组的首元素,如果要得到整个数组的地址需要在数组名前面加上&,即&arr。
5.二级指针
存放指针地址的变量就是二级指针

这里pp就是二级指针。我们都知道指针p解引用一次便可得到num的值,那么我们就能知道pp解引用一次找到的是p,接着我们在解引用一次就能找到num的值。
6.指针数组
指针数组是存放指针的数组。
我们知道 整形int arr[5] 里面的值都是int类型的值,那么 我们就能推出 int*p[5]里面存放的都是指针。

今天的分享就到这了,以上若有错误请各位大佬指正!!!
本文介绍了C语言中指针的基础知识,包括指针的类型、指针类型的意义、野指针及其规避方法、指针-指针、二级指针和指针数组的概念。讨论了指针类型对指针移动步长的影响,以及如何防止野指针问题。
844

被折叠的 条评论
为什么被折叠?



