前言
各位小伙伴周末好,今天我们一起来学习一下困扰了我们多年的指针吧,希望通过今天的学习可以让我们不再恐惧困扰我们多年的指针。
一、指针的定义和原理
在理解指针的定义和原理之前我们先要了解一下我们定义的变量是怎么储存起来的。我们的内存就相当于一栋大楼,而我们定义的变量就相当于一间一间的房间,但是我们现在只知道我们定义的这个变量在这栋楼里,我们却不知道具体在几层几栋,所以就要有一个房间的地址来告诉我们我们的房间(变量)具体在什么位置。而在我们的C/C++中我们用“&”这个符号来代表变量的位置(地址),我们用代码来实现一下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a = 8;
cout<<"a: "<<a<<endl;
cout<<"&a: "<<&a<<endl;
}
输出:
a: 8
&a: 0x7ffe1f6ae744
现在我们再来理解一下指针这个东西,我们现在假设这栋楼的经理给了我一个房卡,上面写的这个房间的具体位置,那么这个房卡就是记录的具体的物理位置,在C++中就是指针这个变量(p)记录的这个变量的地址,而(*p)则表示这个地址所代表的内容,不多BB上代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a = 10;
cout<<"a = "<<a<<endl;
int *p = &a;
cout<<"&a = "<<&a<<endl;
cout<<"p = "<<p<<endl;
cout<<"*p = "<<*p<<endl;
cout<<"&p = "<<&p<<endl;
}
输出:
a = 10
&a = 0x7ffdce225e3c
p = 0x7ffdce225e3c
*p = 10
&p = 0x7ffdce225e40
二、二级指针
二级指针的意思就是存放一个指针地址的指针,就相当于还有一个纸条告诉你存放房间信息的纸条在什么位置,我们用代码表示下:
#include<string>
using namespace std;
int main()
{
int a = 10;
cout<<"a = "<<a<<endl;
int *p = &a;
cout<<"&a = "<<&a<<endl;
cout<<"p = "<<p<<endl;
cout<<"*p = "<<*p<<endl;
cout<<"&p = "<<&p<<endl;
int **q = &p;
cout<<"**q = "<<**q<<endl;
cout<<"q = "<<q<<endl;
cout<<"&q = "<<&q<<endl;
}
输出:
a = 10
&a = 0x7fff2f062664
p = 0x7fff2f062664
*p = 10
&p = 0x7fff2f062668
**q = 10
q = 0x7fff2f062668
&q = 0x7fff2f062670
我们可以看到变量a的值是10,a的地址是0x7fff2f062664,指针p的值是变量a的地址,也就是0x7fff2f062664,这个地址上的值也就是p为10,而指针p本身的地址是0x7fff2f062668,二级指针q存放的是一级指针p的地址(0x7fff2f062668),而**q表示一级指针p上的地址的内容(**q,可以理解为q的值是p的地址,那么再加一个*就是在这个地址上在取一下值,也就是10),而&q则代表了二级指针q本身的地址(0x7fff2f062670),那么如果我们想要存放这个二级指针的地址那么我就可以用一个三级指针来存放,以此类推。。。
三、重温指针数组与数组指针
我们之前在数组一节已经分析过了指针数组和数组指针了,那么我们今天学习完指针之后再来重新温习一下吧!想必一定会有更深的理解了!
指针数组:就是一个数组里的所有元素都是指,我们举一个简单的例子:
#include<iostream>
using namespace std;
int main()
{
int a = 1;
int b = 2;
int c = 3;
int *p = &a;
int *q = &b;
int *z = &c;
int *pr[3] = {p,q,z};
for(int i = 0;i < 3;i++)
{
cout<<*pr[i]<<endl;
}
}
输出;
1
2
3
例2:
#include<iostream>
using namespace std;
int main()
{
char *a[3] = {"aaa","bbb","ccc"};
for(int i = 0;i < 3;i++)
{
cout<<*a[i]<<endl;
}
}
输出:
a
b
c
数组指针:数组指针其实说白了就是指向一个匿名数组的指针,比如:int (*p)[3] ,那么这句话的意思就是我定义了一个指针p,这个指针p指向的是一个大小为3的匿名数组,注意哦,这里的数组是匿名的,反正这里也没有写数组名。所以我们可以定义完数组指针后在去指定一下数组,例如:
#include<iostream>
using namespace std;
int main()
{
int a[3] = {1,2,3};
int (*p)[3];
p = &a;
cout<<*p<<endl;
cout<<a<<endl;
cout<<*p[0]<<endl;
}
输出:
0x7fc70bd4d8
0x7fc70bd4d8
1
总结
指针这玩意烦的一批,掌握这些就差不多了,以后项目中在需要的话就现学现卖吧,学吐了要