指针的理解
开发工具与关键技术:Visual Studio、C++
作者:张国军
撰写时间:2019年04月25日
对于指针的理解,刚开始的时候我还是一脸蒙,但是后来逐渐的对指针的理解和对指针的使用,让我感觉到有很多地方都可以用到指针,下面我来为大家讲解一下我对指针的理解。
指针类型变量——能够存放对象地址的变量,简称“指针变量”;指针也是一个变量,它里面存放的东西也是可以改变的,当然是在没有被const修饰的时候。
下边我们来看一个实例:
#include <iostream>
using namespace std;
int main()
{
int a=100;
int *p;
p = &a;
cout << p<<endl;
cout << *p<<endl;
}
这是一个简单的指针指向了变量a的地址,指针里边存放的是地址,(&a)是取a的地址的意思,当我们需要通过p去查看a的值得时候,那么我们就需要通过p里边存放的地址进行解址,(*)是我们的解址符,通过解址我们就可以得到我们想要a的值。
意思就是:比如:你跟我说你家里边有一百条金条,那么你给我一个地址,我需要通过解地址去找到你家,才可以去获取你里边的金条数,获取有多少条。
间的来说就是指针并非是保存着对象的值,而是保存这对象的地址,当我们需要其他操作的时候需要通过解地址去改变。
下边我们来看一个通过指针改变值得一个操作和理解:
#include <iostream>
using namespace std;
int main()
{
int a=100;
int b;
int *p;
p = &b;
*p = a / 2;
cout << p<<endl;
cout << *p<<endl;
}
首先我这里是将p指针指向了b,b刚开始是没有值得,我们我们可以通过指针p进行对b的值进行改变,从上面的代码和结果我们可以看出b的值是从(p = a / 2; )这里得来的,所以我们可以通过指针进行解地址对指针对象的值进行改变,前提是我们得指向我们需要改变的对象,然后通过解地址就可以了。
下面我们来看一下指向指针的指针,我们也可以叫它二级指针,从它的字面意思我们可以读到它是一个指针,但是呢,它所指向的不再是我上面的普通变量,而是指向了我们的指针。
指针,我们也知道当我们声明的时候系统将会给我们的指针分配内存的,那么有内存我们也可以想到有相对应的内存地址,所以我们指针也是有地址的。我们从上面也就说了,指针里边存放的是地址,那么我们是否也可以将指针的地址给到另外一个指针里边呢?
下边我们来看一下实例:
图中我们又声明了一个指针,但是当我们将指针p的地址给到p1的时候编译器给我们报错了,说道:不能将“int*”类型的值分配到“int*”类型的实体。也就是我们赋值的类型不一致,所以当我们想把一个指针给到另外一个指针的时候我们声明一个(int*)类型是不行的,所以我们需要声明一个(int**)类型的指针,也就是我们的二级指针(指向指针的指针)。
#include <iostream>
using namespace std;
int main()
{
int a=100;
int b;
int *p;
int **p1;
p = &b;
*p = a / 2;
p1 = &p;
cout << *p1<<endl;
cout << **p1<<endl;
}
但我们再从p1那里加一个*的时候,那么他就成了我们的二级指针,二级指针跟我们的一级指针取值是一样的,但我们需要二级指针里边的东西的时候,那么我们需要解址,
那么当我们刚开始解(*p1)的时候,我们解出来的是我们一级指针p的地址,当我们再进行解址的时候,我们才能解到b的值。
也就是我们需要进行解址解到最里边的话,那么我们就需要一层一层的解进去。
大家也不难猜到还有三级指针,或以上的指针,它的用法跟我们的二级指针差不多的了,
各位需要用到什么指针那就看你们需要怎么用。
这纯属是我个人的理解,如果大家有什么不同之处,欢迎大家分享讨论;