目录
一、什么是指针
二、指针和指针类型
三、野指针
1.野指针的成因:
2.如何规避野指针
四、指针运算
1.指针+-整数
2. 指针之间的加减
五、二级指针
六、指针数组
一个男人,到底要走多少的路,才能成为一个真正的男人
本专栏适用于有一定C语言基础并且还要继续学习的人
往期回顾:
C语言函数详解
C语言操作符详解
C语言实现扫雷及进阶
C语言实现三子棋
C语言实现猜数字游戏
C语言for循环详解
C语言初学可能会遇到的问题(一)
文章质量在努力提高中...
指针是C语言的精髓,用好它,将能真正发挥C语言的强大功能。博主已经将指针的基础用法为大家准备好,并富有大量图解,有需要学习的朋友可以收藏保存,也欢迎大家与博主讨论,后续将会推出C语言指针的进阶内容。
一、什么是指针
指针是内存中一个最小单元的编号,也就是地址。
通常口语中的指针,通常指的是指针变量,是用来存放内存地址的变量。
每一个变量的创建,编译器都会给它分配一块空间来存储,而变量在这些空间中以二进制补码的形式存储,不了解补码的可以去看C语言操作符详解中有详细介绍。每一块内存空间都有对应的地址编号,这些地址在内存中是连续的,像门牌号一样,指针就相当于日常生活中的门牌号,通过某人的门牌号,就可以找到这个人。同样,拿到了指向某个变量的指针,就可以通过解引用,找到这个变量,然后对这个变量进行操作。
那么如何将地址(指针)存入指针变量中呢
a为int型,占四个字节,&a是将a的第一个字节的地址存放在指针变量p中。
指针的大小:在32位平台是4个字节,在64位平台上是8个字节
二、指针和指针类型
指针类型的意义:决定了p指向的对象类型;p解引用时可以访问的对象的字节数;决定了指针+/-整数操作时的步长。
(1)指针指向的数据为啥类型,一般就将指针类型定义为啥类型,比如指针要指向一个整形变量,就将这个指针定义为int*
(2)解引用时可以访问的对象的字节数;如果有特殊要求的话,可以修改指针类型为与自己解引用时想访问的字节数相等的数据类型
例如,在解引用时想访问1个字节的内容,即可将指针类型定义为char*类型,在解引用时想访问4个字节的内容,即可将指针类型定义为int*
(3)指针加减整数时的步长;指针加1,跳过的字节数
三、野指针
野狗:就是没有主人的狗(大多数,只是个例子);那么野指针,就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)
野指针是很‘危险’的,容易造成内存的非法访问。
1.野指针的成因:
(1) 指针未初始化
未初始化是指定义指针的时候,没有规定它指向的位置,如下面的指针p,那它现在就是一个野指针
(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;
}
当i=11时,循环继续执行,指针p访问的范围已经超过来了数组arr的范围,因为数组外的值是未知的,而可以通过解引用p访问到数组外,所以当这次循环执行后,p就成了野指针。
(3)指针指向的空间释放
2.如何规避野指针
(1)指针初始化
如果在定义指针时不知道指针应该指向哪里,可以先初始化为空指针 int*p=NULL;初始化为空指针后,在后面使用这个指针时即可直接修改指针要指向的对象
(2)小心指针越界
用指针对数组进行操作时,要防止指针指向数组外的空间,指针所指对象超出数组范围后,这个指针就会变成野指针,变得不可控
(3)指针指向空间释放,及时置NULL
比如,当调用函数结束后,函数里面的局部变量会销毁,如果有指向这个局部变量的指针,那么这个指针就会变成野指针,当这个变量的空间释放后,及时将指针改为空指针
(5)避免返回局部变量的地址
指针p所指向的是test函数的返回值,为局部变量a的地址,但这个值所占用的空间已经在函数调用结束后还给了操作系统,所以再通过解引用指针p去访问这个变量就是非法的,即使如图解引用后可以访问的到,也是不允许的
(6)指针使用之前检查有效性
在每次使用指针时要先判断,这个指针是不是空指针,不是空指针,才能对这个指针进行操作
四、指针运算
1.指针+-整数
指针在+-整数时,向前/向后跳过指针对应的字节数,一般情况下,在数组中进行指针+-整数的情况会多一些,因为数组中的元素是连续存放的,且每一个元素的数据类型都相同,所以指针加1再解引用,就可以访问到下一个元素,指针减1在解引用也可以访问到上一个数组元素
这段代码可以清晰地看出数组与指针之间的关系
2. 指针之间的加减
指针减指针:得到两个指针之间的元素个数
p指向数组首元素,q指向数组最后一个元素,他们之间有9个元素,因此q-p=9
指针加指针,没有实际意义
五、二级指针
二级指针指向的对象是指针
*p可以找到a,那么**q也能找到a,先对*q找到p,再对p解引用找到a,即 *(*q),简写为**q
六、指针数组
真正的男人,主语是男人。那么指针数组,主语也就是数组,存放指针的数组
指针数组,就是存放指针的数组,即数组的每一个元素都是指针(地址)
将指针数组与二级指针结合起来
本文收录于水火莲花-C疑难专题 C语言学习专题
这两个专题可用于正在学习C语言,并且有一定基础的人,专栏持续免费更新中...