记录一下自己学习指针的过程~
#include <iostream>
using namespace std;
int main() {
int a = 5;
int* p = &a;
cout << p << endl;
cout << *p << endl;
cout << *p + 5 << endl;
cout << a << endl;
cout << *p << endl;
return 0;
}
/*
0x7fff3221afb4
5
10
5
5
*/
如果想要获取变量 $a$ 的地址,那么可以使用取地址符号 $\&$,例如 $\&a$。这样就获取到了变量 $a$ 在内存中的地址;
如何声明一个指针呢?
假如我想声明一个 $int$ 类型的指针,那么可以使用 $int^\* \; p$,为了方便区分,这里将 $\*$ 与 $int$ 写在了一起,表明我想要声明一个 $int$ 类型的指针,并且这个指针的名字叫做 $p$。如果我们直接输出 $p$,那么此时 $p$ 代表的就是变量 $a$ 所在内存中的地址,也就是 0x7fff3221afb4
。
如果想要获得指针 $p$ 所指向的内容呢?
直接输出 $\*p$,可以得到输出的结果为 $5$,此时的 $\*p$ 表示:指针 $p$ 所指向的内容是 $5$。如果要在 $5$ 的基础上再加 $5$,那么直接使用 $\*p + 5$ 即可,此时输出 $10$。
但是,对于 $p$ 来说,它虽然存储了 $a$ 的地址,但是 $p$ 本身也是一个变量,因此 $p$ 也会有一个地址。我们可以使用 $\** q$ 来取得 $p$ 的地址,也就是指针的地址。如下:
#include <iostream>
using namespace std;
int main() {
int a = 5;
int* p = &a;
cout << p << endl;
cout << *p << endl;
cout << *p + 5 << endl;
cout << a << endl;
cout << *p << endl;
cout << endl;
int** q = &p;
cout << q << endl;
cout << *q << endl;
return 0;
}
/*
0x7fff24ad058c
5
10
5
5
0x7fff24ad0590
0x7fff24ad058c
*/
直接输出 $q$ 的话,它表示指针 $p$ 的地址。而输出 $\\*q$ 的话,表示变量 $q$ 所存储的内容,由于$q$ 所存储的内容为 $p$ 的地址,因此输出结果的最后一行 0x7fff24ad058c
与输出结果的第一行是相同的。
上面这个地方可能有点绕,但是画一下图就好理解了。
数组是一种特殊的指针,更有意思~
#include <iostream>
using namespace std;
int main() {
char c;
int a[5] = {5, 2, 2, 6, 7};
cout << (void*)&c << endl;
cout << endl;
cout << a << endl;
for (int i = 0; i < 5; ++i) {
cout << (void*)&a[i] << endl;
}
return 0;
}
/*
0x7fffe083119b
0x7fffe08311a0
0x7fffe08311a0
0x7fffe08311a4
0x7fffe08311a8
0x7fffe08311ac
0x7fffe08311b0
*/
从结果中可以看到:如果单纯地输出数组 $a$ 的名称,那么就可以得到该数组的地址。并且更加有趣的是:元素 $a[0]$ 的地址与数组 $a$ 的地址是相同的!
由于数组中每个 $int$ 类型的元素占 $4$ 个字节,因此,数组中元素和元素之间的地址也是相差 $4$ 的。
需要注意的是:对于 $char^\* \; p$ 来说,如果执行 $p+ 1$,那么加的这个 $1$ 是根据指针类型来计算的。也就是说,对于 $char$ 类型的指针,那么加 $1$ 之后,来到的是 $1$ 个长度的位置;而对于 $int$ 类型的指针,也就是 $int^* \; p$,对它进行加 $1$ 之后,来到的是 $4$ 个长度的位置。
接下来更有意思的来了,往下看:
#include <iostream>
using namespace std;
int main() {
int a = 5;
int* p = &a;
int& q = a;
cout << p << endl;
cout << *p << endl;
cout << endl;
cout << q << endl;
cout << &q << endl;
return 0;
}
/*
0x7ffffd0408bc
5
5
0x7ffffd0408bc
*/
对于 $int^\* p$ 我们上面已经讲到了,而 int& q = a;
又是什么鬼?
其实, int& q = a;
语句的意思就是:给变量 $a$ 起了一个别名,当我修改 $a$ 的值的时候,那么也就相当于修改了 $q$ 的值。这就相当于你有一个大名和小名,不管是叫你大名,还是叫你小名,都代表的是你自己,而不是其他人。
膜拜大佬
hah,不是大佬,之前学过 Java,现在会过头学 C++,看到指针这一块比较有意思,就写了一篇“笔记”。
指针真的有意思吗,学到后边你会吐的,
话说我用指针写链表基本都没A过因为 Java 中没有指针的概念,所以学了一段时间 Java 后,感觉代码没有 C++ 简洁。指针如果用的好的话,还是挺方便的。我在这里学指针的目的不是完全把它弄懂,而是能够应付绝大多数算法题就可以了~ :-) 还需要向大佬们学习,给大佬递茶~
啊这,,,我很菜的啊
^_^ 共同学习~
代码简洁???我python表示不服!!!
C++ 表示不说话…hah