首页 > 其他分享 >「学习笔记」指针的基础入门

「学习笔记」指针的基础入门

时间:2023-08-16 20:22:04浏览次数:45  
标签:变量 int 笔记 vector 数组 main 指针 入门

为啥会突然学这个呢?

因为长链剖分优化 DP 的状态转移用到了指针数组,平时的 STL 使用中也经常碰到指针。

So,就去学了一下,记录一下学习的笔记。我绝对不会告诉你另一个原因是因为最近做DP做累了想来写篇博文水水时间

引入

我们平时用 scanf 输入的时候,都会在变量名前加一个 &,但是,字符数组除外。这个 & 其实是取地址符,什么是地址呢?(以下为我的理解)你可以把它想象成你家房子的定位,这个就算是一个地址,只不过你家定位指向的是你家房子,而我们程序中的地址指向的是它对应的变量。约等于你住进了一个变量 /dog

这也就引出了指针的意义所在,即是一个指向元素的指向标,但是请注意,指针也是数据,存放这类数据的变量就成为“指针变量”。

我们的 & 符号,则就是取出指向这个元素的指向标(指针)。

运行下面这段代码:

int main() {
    int a;
    cin >> a;
    cout << a << '\n';
    return 0;
}

你输入 \(3\),程序就输出 \(3\),这里我们输出的是 \(a\) 这个变量元素

再运行这段代码:

int main() {
    int a;
    cin >> a;
    cout << &a << '\n';
    return 0;
}

你再次输入 \(3\),程序却输出了一个你看不懂的东西 0xe71e7ff82c,这个就是变量 \(a\) 的存储地址,没错,已经不是元素了,这串十六进制的数字就是变量 \(a\) 的存储地址。

声明与使用

C++ 中,指针的定义实在变量类型的后面加个 *,例如 int*double* 等等,想要获取指针指向的元素,只需要在指针变量前加一个 * 即可。

int main() {
	int a;
	int* p = &a;
	cout << a << endl; // 3
	cout << *p << endl; // 3
	cout << &a << endl; // 0xe71e7ff82c
	cout << p << endl; // 0xe71e7ff82c
}

对结构体变量也是类似。如果要访问指针指向的结构中的成员,需要先对指针进行解引用,再使用 . 成员关系运算符。不过,更推荐使用运算符 -> 这一更简便的写法。

struct ThreeInt {
  int a;
  int b;
  int c;
};

int main() {
  ThreeInt x{1, 2, 3}, y{6, 7, 8};
  ThreeInt* px = &x;
  (*px) = y;    // x: {6,7,8}
  (*px).a = 4;  // x: {4,7,8}
  px->b = 5;    // x: {4,5,8}
}

当然了,也有指向指针的指针,指针的指针被我们称为二级指针,当然了,也会有三级指针、四级指针……

二级指针是在变量类型后面加 **,三级指针是在变量类型后面加 ***

int main() {
	int i = 30;
	int *pi = &i;
	int **ppi = &pi;
	cout << i << endl; // 30
	cout << *pi << endl; // 30
	cout << **ppi << endl; // 30
}

指针的偏移、操作

数组是一块连续的存储空间。而在 C++ 中,直接使用数组名,得到的是数组的起始地址,因此,我们在 scanf 输入字符数组时不需要加 &,我们常用 [] 运算符来访问数组中某一指定偏移量处的元素。比如 a[3] 或者 p[4]。这种写法和对指针进行运算后再引用是等价的,即 p[4]*(p + 4) 是等价的两种写法。

STL 中的指针

在我们常用的 STL 容器,像 vectorset 等,还有一些 STL 函数,像 lower_boundupper_boundfind() 等等,我们都可以见到指针的身影,像 vector 的首指针 begin(),尾指针 end()find() 函数最后返回的类型是指针,等等。

指针定义需要一个关键字 iterator,定义 vector 的指针如下

vector<int>::iterator it;

下面的代码片段

vector<int> v;

int main() {
    v.emplace_back(1);
    v.emplace_back(2);
    vector<int>::iterator it = v.begin();
    cout << *it << '\n';
    return 0;
}

最后输出的是 v 的首元素。

当然,C++11 以后,可以直接用 auto 在大多数情况下来代替这个关键词。

有了指针,就可以遍历一些 STL 容器了,像 setmap 这样我们无法直接用数组下标遍历的容器。

int main() {
	set<int> s;
	set<int>::iterator it = s.begin();
	s.emplace(1);
	s.emplace(2);
	for (; it != s.end(); ++ it) {
		cout << *it << '\n';
	}
}

一些指针可以转化通过减去首指针或数组名转化成数组下标,在 vector 中是减去 begin(),在数组中是减去数组名(常见于一些代码中的 lower_boundupper_bound 函数),但是,像 set 就无法实现这个转化(可能是因为你不能直接用数组下标访问 set 中的元素)。

标签:变量,int,笔记,vector,数组,main,指针,入门
From: https://www.cnblogs.com/yifan0305/p/17626289.html

相关文章

  • GIC入门(一):中断类型,状态转换,中断路由,安全模型
    GIC是ARM的通用中断处理器,和ARMCortex-A和Cortex-R系列CPU搭配使用,M系列使用NVIC(nestedvectoredinterruptcontroller)。本篇文章介绍GICV3、V4的一些基本概念:中断类型,状态转换,中断路由,安全模型 1.InterrupttypesSPI:sharedphripheralinterrupt,可以设置为被所有PE处......
  • Redis入门
    1.认识NoSQL1.1 什么是NoSQLNoSQL最常见的解释是"non-relational",很多人也说它是"NotOnlySQL"NoSQL仅仅是一个概念,泛指非关系型的数据库区别于关系数据库,它们不保证关系数据的ACID特性NoSQL是一项全新的数据库革命性运动,提倡运用非关系型的数据存储,相对于铺天盖地的关系......
  • ACP认证笔记
    每个ecs最多可加入5个安全组,至少加入一个安全组安全组支持有状态应用。一个有状态的会话连接中,会话的最长保持时间是910秒。安全组会默认放行同一会话中的通信。例如,在会话期内,如果连接的数据包在入方向是允许的,则在出方向也是允许的。阿里云的云服务器ECS实例的使用中,要创建新的安......
  • 学习笔记 - Java 面向对象_上
    学习面向对象内容的三条主线Java类及类的成员:属性、方法、构造器;代码块、内部类面向对象的特征:封装、继承、多态、(抽象)其他关键字的使用:this、super、package、import、static、final、interface等类的相关概念类和对象概述类(Class)和对象(Object)是面向对象的核心概念。......
  • WebSocket_入门案例
           ......
  • Delphi正则表达式初学入门
    一前言 对于正则表达式,相信很多人都知道,但是很多人的第一感觉就是难学,因为看第一眼时,觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完全不知所云。 其实只是对正则不了解而以,了解了你就会发现,原来就这样啊正则所用的相关字符其实不多,也不难记,更不难懂,唯一难的就......
  • javascript学习笔记day2
    今天在b站跟学了黑马的前端js课程,因为是第一天学习都对于我们这种学过了的来说其实挺简单的,不过今天一边做公司的项目一边学习多少是有点时间不够的感觉,看样子明天要开二倍看了,下面是今天的笔记什么是js:javascript是人机交互的一种编程语言js由哪几部分组成:ECMAScript和webapis......
  • 安卓程序逆向入门
    Step2将smali代码,翻译成java代码。主要包括两件事,第一件事翻译checker代码,顺便找一下满足checker条件的输入,使得Task1:的输出为true;第二件事是翻译encoder代码。当然在做第一件事的时候为了正确调试程序,需要翻译CheckBox代码。所有的java代码都存储在smali2java目录下。2-1翻译c......
  • 安卓程序开发入门
    Step1本步骤主要复习安卓软件开发的基本流程;实验共有四个要求,即编写一个会重启后自启动的位置显示,并具备在子进程中调用住进程UIChange函数功能的,同时能够使用反射方法调用libs库中依赖的jar文件的安卓app。按照实验指导书的要求依次实现上述要求。1-1后台服务实现了接收重启命......
  • 笔记整理--C语言--很酷的C语言技巧 - 博客 - 伯乐在线——转载
    C语言常常让人觉得它所能表达的东西非常有限。它不具有类似第一级函数和模式匹配这样的高级功能。但是C非常简单,并且仍然有一些非常有用的语法技巧和功能,只是没有多少人知道罢了。指定的初始化很多人都知道像这样来静态地初始化数组:intfibs[]={1,1,2,3,5};C99标准实际......