指针就是有指向的变量,它指向的是和存储指针本身类型相同的变量的空间,指针有多级指针,以及指针直接指向变量存放空间,二级指针指向的是存放同类型一级指针的空间,多级类推二级指向一级一样指向它的前一级指针存放空间,下面在介绍指针的分类之前我简单的通过画图展示一下指针和变量之间、指针和指针之间的指向关系:
在图片中可以看出有整型变量和整型一级和二级指针,一级指针指向了变量a,二级指针q指向了以及指针p,在图片里也不难看出指针里存放的是地址,这就是为什么通过指针能找到它指向的变量,而且还能更改它的值,下面一段代码体现:
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int *p = &a;
int **q = &p;
cout<<"a = "<<a<<endl;
cout<<"*p = "<<*p<<endl;
cout<<"**q = "<<**q<<endl;
cout<<"通过一级指针改变"<<endl;
*p = 2;
cout<<"a = "<<a<<endl;
cout<<"*p = "<<*p<<endl;
cout<<"**q = "<<**q<<endl;
cout<<"通过二级指针改变"<<endl;
**q = 8;
cout<<"a = "<<a<<endl;
cout<<"*p = "<<*p<<endl;
cout<<"**q = "<<**q<<endl;
return 0;
}
这里的二级指针改变和一级是一样的,我们都知道p是取p所指向空间的值就是a,那么*q是不是取q所指向的空间的值p,那么我们把q指针(q)这样写我想能更好理解点,既然*q和p是相等的,那么(*q)是不是就是*p了,那么是不是通过**q同样可以指向a,只不过是中间借鉴了一个一级指针而已。
在经过上述阅读后我相信哪怕是没有学过指针的同学对指针应该有了认识,那么接下来我们来说说指针的分类,指针按照他们的属性可分为三类:
1. 原生指针
就是最普通的指针,定义类似: 类型 *变量名;
与之对比的是使用上有类似指针的功能 实际并不是指针。比如:迭代器
[一个类重载 *和->操作符 那么可以像指针一样使用 但是这种并不是原生的]
2. 泛型指针
第一种就是 void *指针 可以指向任意的数据结构 因此可以称为"泛型"。
第二种就是指具有指针特性的泛型数据结构 如:泛型迭代器和接下来要说的智能指针。
3. 智能指针
C++中没有自动回收内存的机制,因此出现了智能指针。
一般我们将一个指针封装到一个智能指针类中,该类中有一个引用计数器。
对指针的复制等操作会使引用计数+1,delete操作会使引用计数-1。
希望阅读完这篇博客对你学习指针有所帮助,指针是很多语言的基本技能,所以在学好指针必须了解指针的两值四方面,如果有人需要可以留言我有一本电子版资料讲的就是指针是我师傅自己写的,通俗易懂可以给你发过去。