C++基础入门教程(四):枚举和指针

2020-01-06 13:12:44于海丽

复制代码
int num = 10;
    int *p = #
    *p = 20;
    std::cout << *p << "n";
    std::cout << num << "n";

 

最后,*p和num都是20。
p是指针变量,它保存了num变量的内存地址。
而*p就是这个内存地址上面的值,也就是我们的变量num的值了。
于是,*p = 20 就代表把这个内存地址上的值改为20。

重点来了:

1.假设num的内存地址0xffffff,这个地址上的存储的内容是数字10
2.p是一个指针,它保存了num的内存地址,所以p的值是0xffffff,这个地址上的存储的内容是数字10
3.*p代表是p指向的那个内存地址上面所存储的内容,也就是数字10,换句话说,*p的值是10
4.指向*p = 20,相当于把p指向的内存地址上面的内容改为20
5.由于num的内存地址就是p指向的地址,所以num在内存中保存的值已经改变了
6.最终num的值也会变成20

明白了么?(小若:用中文再说一遍)
嗯,用中文再说一遍的话,那就是:

因为p指向的内存地址就是num所在的内存地址,所以通过num和*p都能改变这个地址上的内容。
一句话,此刻*p相当于num,可以进行各种操作(赋值、加减法等等)
(小若:早点说中文多好啊!非得显摆你那半调子日语吗?!)

5.指针外传

有时候,我们可以这样声明指针:

复制代码
int *num;
// 但你千万不能这么使用
*num = 100;

 

咋一看,这么使用好像很正常,和刚刚说的一样。
但,请注意,指针num在声明的时候并没有赋值,也就是说,这个指针现在不知道是指向哪里的。
所以,随便使用这样一个不知道是指向哪的指针,很可能会破坏我们的程序。
 
比如吖,我们本来是想声明一个指向我们一根头发的指针,但是,我们没有给它赋值。
于是,这指针就不知道指向哪了,它可能还指向它以前曾经指过的地方。
万一这指针以前指向的地方是我们的腰部以下的部位呢?
 
万一我们用这个指针执行了“剪掉指针所指的地方,全剪了”。
没错,本以为剪的是头发,结果呢!把腰部以下给剪了!