指针
前言
本博客中,有一部分内容参照了以下书籍中的内容:
《C++从入门到精通》:
7.4小节指针(P131)
7.5小节指针与数组(P140)《信息学奥赛课课通(C++)》
第八单元第一课 指针的概念(P278)
第八单元第二课 指针的引用与运算(P285)
第八单元第三课 指针与数组(P291)《小学生C++趣味编程(下册)》
第八单元第80课 今雨新知——地址与指针(P324)
第八单元第81课 民主选举——指针与数组(P327)注:本博客内容不侵权
指针概念
故事
一天,小A从小B这里借走了一本书📕,可是当小A来还书的时候,小B不在家。于是小A把书放到了书架第3区,并写了一张留言条,内容是“第3区”。当小B回来时,就知道这本书📕在哪里了。
这张留言条相当于一个指针,它的内容不是书📕的内容,而是书的位置,这样,就可以通过留言条(指针)找到书📕(值/变量)了。
指针图像
一般计算机内部的“书架”(内存)是这样的:
指针指向变量时就是这样的:
指针套娃
指针最有趣也最能把程序员搞懵B的地方就是套娃指针,普通指针指向普通变量,而指针指针变量指向普通指针,这是因为普通指针毕竟它也是个变量嘛,所以得有地址,这一有地址,就有指针可以指向它。比如说指针指针变量不也可以被指针指针指针变量指向吗。是不是把你搞懵B了?
指针运算
这可能是一个比较难的地方。比如p是一个指针,地址是0091,要想知道p的下一个地址,就要用p+1,更往下就是p+2、p+3……上面的地址,p-1、p-2、p-3……以此类推。
不过千万不要再指针运算时在指针明前加’*’,如果变成了*p+1,那就是要求p所指向的地址所存储的值加一的结果了,而不是一个指针了。
指针与数组
指针很有用的地方就是和数组的融合,大家看一看我的《函数的参数和返回值》中的前言里的int *??? = new int[???];,就知道这是定义了一个指针但是其实是一个数组,也就是说指针和数组是一个概念(好可怕啊)。这就是最不好理解的地方了(我个人理解)。
这地方也涉及到了指针运算。
指针程序
定义
#include <bits/stdc++.h>
using namespace std;
int main()
{
int *p;
return 0;
}
很简单,是不是?
赋值
- 定义时赋值
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a;
int *p = &a;
return 0;
}
- 后来赋值
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a;
int *p;
p = &a;
return 0;
}
大家简简单单就能看出,’&'是取地址运算符。
不过指针不可以赋值为数值,只能赋值为地址。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int *p = 100; // 报错
return 0;
}
如果是强制转换,没办法获取该地址的值。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int *p = (int *)100;
cout << *p << endl; // 报错
return 0;
}
另外指针没法当普通变量用。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int *p;
*p = 100; // 指针没得到地址
cout << *p << endl; // 报错
cout << p << endl; // 报错
return 0;
}
小结
指针变量很有趣,数组和它有关联。
定义赋值有规矩,’*’’&'符号不能忘。
赋值错误大学问,强制转化也不行。
指针不能没地址,指针套娃真奇异。