指针
  • 板块学术版
  • 楼主xiaoyin2011
  • 当前回复16
  • 已保存回复16
  • 发布时间2021/1/3 19:42
  • 上次更新2023/11/5 05:10:37
查看原帖
指针
377258
xiaoyin2011楼主2021/1/3 19:42

指针

指针概念

故事

一天,小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;
}

很简单,是不是?

赋值

  1. 定义时赋值
#include <bits/stdc++.h>
using namespace std;
int main()
{
	int a;
	int *p = &a;
	return 0;
}
  1. 后来赋值
#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;
}

小结

指针变量很有趣,数组和它有关联。

定义赋值有规矩,'*''&'符号不能忘。

赋值错误大学问,强制转化也不行。

指针不能没地址,指针套娃真奇异。

2021/1/3 19:42
加载中...