前言
本来这次我想写关于进制的帖子的,但是感觉指针在为后面的很多内容做铺垫,所以我先把关于指针的帖子写了。况且我知道有很多小伙伴现在没有学习指针,点个赞吧,求求啦!
正文
指针
还记得我们定义普通变量的时候用的是Typ Var = Val;
,而指针在之前我们讲过,分别出现在这两个帖子里面:
(十八)排序
(十三)动态字符串
*
还熟悉吗?它能把指针的值找出来,而它有一个“死对头”,那就是&
,因为&
是将变量转换为指针
因为*
要把指针的值找出来,所以定义指针变量是这种方式:
Typ* p = &n; //让指针变量p指向变量n
不知道大家在别人写的代码中有没有见到new
关键字,如果见到过,你会发现new
的后面跟上了一个变量名,是的,new
定义是这样的
Typ *p = new Vtyp; //让指针变量p做Vtyp的工作
Typ *p = new Atyp[N]; //让指针变量p做共N项的Atyp的工作
有的时候我们想暂时不定义指针指向的值,我们可以使用关键字nullptr
,null
的意思是“无效的”,而ptr
的全写是pointer
,它的意思是“指针,指”,因此这个关键字的意思就是“无效的指针”
Typ *p = nullptr; //定义指针变量,暂时不指向变量
有一种指针,叫二维指针,它可以实现一维数组的操作,又怎么定义呢?
Typ *p[N]; //定义一个共N项的整型数据的指针所组成的数组
Typ (*p)[N]; //定义一个共N项的指向整型数据组成的数组的指针
Typ **p; //定义一个指向由指针组成的数组的指针
被指了的变量会随着指针的值而变化
在定义后,怎么调整值呢?
*p = &n; //让指针p指向n
*p = Val; //赋指针p的值为Val
p[n] = Val; //赋p[n]的值为Val
又如何调用值呢?
*p //返回p所指向的值
p //返回p所指向的地址
p[n] //返回p[n]的值
在使用指针时,我们要注意不要使用野指针(越界指针),否则会RE或者错误输出
另外,指针变量是可以删除的
这是一个指针的实例,以前我们读入数组的方法是这样的
#include <iostream>
using namespace std;
int main () {
int n;
cin >> n;
int a[n];
for(int i=0; i<n; i++)
cin >> a[i];
for(int i=0; i<n; i++)
cout << a[i] << ' ';
return 0;
}
现在读入又应该怎么整呢?
#include <iostream>
using namespace std;
int main () {
int n;
cin >> n;
int* a = new int[n];
for(int i=0; i<n; i++)
cin >> a[i];
for(int i=0; i<n; i++)
cout << a[i] << ' ';
return 0;
}
迭代器
#include <iostream>
using namespace std;
int main () {
int n;
cin >> n;
int a[n];
for(int* it=a; it!=a+n; it++)
cin >> *it;
for(int* it=a; it!=a+n; it++)
cout << *it << ' ';
return 0;
}
可以看到上面的方法有着一个遍历变量it
,它的全写是iterator
,意思是迭代器。迭代器如何定义呢?首先,我们要找到数组的起始迭代器(见上一篇帖子),随后使用it++
进行递增。就像这样
int a[3] = {8, 3, 6};
int* it = a;
cout << *it << endl; //输出8
it ++;
cout << *(it++) << endl; //输出3
cout << *it << endl; //输出6
另外,我们可以用for
循环遍历迭代器,迭代器只有==
和!=
两种判断运算!
int a[5] = {1, 5, 6, 3, 2};
for(int* it=a; it!=a+n; it++) {
cout << *it << ' ';
}
/*输出:1 5 6 3 2 */