一天,小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;
}
指针变量很有趣,数组和它有关联。
定义赋值有规矩,'*''&'符号不能忘。
赋值错误大学问,强制转化也不行。
指针不能没地址,指针套娃真奇异。