很多初学者包括我自己在学习指针时,会认为指针非常复杂且难学。但经过认真思考和了解过之后会发现只要认识其规律和运作本质,这一切掌握就会变得轻松多了。当然,它的确很难以理解和掌握,因为涉及到很多计算机底层的知识,这里博主会用相对较为简单的方式来解析指针的相关概念。

首先需要了解

什么是指针,什么是指针变量,什么是内存地址,什么是取地址,以及变量和内存地址之间的关系。

变量与内存地址

在我们使用 C/C++ 编写程序声明一个变量时,比如

string name = "张三"; 

计算机会在内存中开拓一块字符串类型的空间,往这个空间里面放字符串类型数据: 张三 ,并把这个空间命名为 name ,这个就是我们常见的变量。不过在计算机中,内存的数据都是有地址的(你可以理解为家庭住址)。而内存地址是由计算机来分配的十六进制数。那么我们就假设这个空间地址为 0053F754 。

所以,当前 name 空间中存放的数据是 “张三”,而空间地址是 0053F754。

zhangsan.png

如果我们想将用 cout 打印它的值:

cout << name <<endl;

此时会从内存中先找这个 name 空间在哪里,然后再找到里面的数据 张三 ,并将数据输出打印在电脑显示屏上。

指针与指针变量

为了搞懂这个指针与指针变量是什么和其作用,我们来看下面。

此时我要定义 1个指针 p
定义方法:[数据类型] * [变量名];

string * p;

其中 * 就代表指针类型的意思,而 p 则是指针变量。

这个指针 p 它本身也有一块空间和地址,但是它并不能像普通变量一样可以存放普通数据,但是它可以存放变量的地址。

接下来我们可以通过示例来看指针的使用:

取地址

这下面我定义了1个 string 类型的变量 name,数据是 张三,同时定义了1个 string 类型的指针 p。
当我们需要获得 name 变量的内存地址时,只需要用取地址符 &name 就能获取到变量的地址。
此时指针 p 要获取到name的内存地址只需要 p = &name 即可,这种操作一般称之为指针指向了name 变量的地址,此时指针变量 p 则变成了 name 变量的地址。

#include <iostream>
#include <string.h>
using namespace std;
int main(){
    string name = "张三";
    string *p;
    p = &name;
    cout << "name 的地址是:"<< &name <<endl;
    cout << "p 的地址是:"<< &name <<endl;
    return 0;
}

运行结果:

name 的地址是:0x61fef0
p 的地址是:0x61fef0

修改地址数据

而如果我们要修改 name 变量的数据,指针也可以通过地址来修改变量的值。

#include <iostream>
#include <string.h>
using namespace std;
int main(){
    string name = "张三";
    string * p;
    //指针指向 name 的地址
    p = &name;
    //修改 name 地址的值
    *p = "陈陈君";
    cout << "name:" << name << endl;
    cout << "p:"<< *p << endl;
    return 0;
}

运行结果:

name:陈陈君
p:陈陈君

因为 name 的地址被 指针p 所指向,指针变量p 变成了 name 的地址,同时指针p修改了 name 地址的值为陈陈君。因此 name 和 指针p 都等于 陈陈君,所以结果相同。

上面讲了一些关于指针、指针变量、内存地址、取地址的关系和概念。

下面我们来看指针的地址,没错,是指针的地址。上面我提到了1个概念:不仅普通变量有自己的空间和地址,指针变量也有自己的空间和地址。

#include <iostream>
using namespace std;
int main(){
    int a = 10;
    int * b;
    b = &a;

    cout << "变量a的地址 = " << &a << endl;
    
    cout << "指针变量b里存放的地址 = " << b << endl;

    cout << "指针b自身的地址 = " << &b << endl;
    return 0;
}

运行结果:

变量a的地址 = 0x61ff0c
指针变量b里存放的地址 = 0x61ff0c
指针b自身的地址 = 0x61ff08

看到这里我相信你应该会对指针有所了解了,这是我的以上拙见。



文章目录