C++入门系列-基于范围的for循环(C++11)和指针空值nullptr(C++11)

🌈个人主页:羽晨同学 

💫个人格言:“成为自己未来的主人~”  

基于范围的for循环

范围for的语法

 在C++98中如果要遍历一个数组,可以按照以下方式进行:

void TestFor()
{
	int array[] = { 1,2,3,4,5 };
	for (int i = 1; i < sizeof(array) / sizeof(array[0]); i++)
		array[i] *= 2;
	for (int* p = array; p < array + sizeof(array) / sizeof(array[0]); p++)
		cout << *p << endl;
}

对于一个有范围的集合而言,有程序员来说明循环的范围是多余的,有时候还容易犯错误,因此C++11中引入了基于范围的for循环,for循环后的括号由冒号‘:’分为两部分,第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围

void TestFor()
{
	int array[] = { 1,2,3,4,5 };
	for (auto& e : array)
		e *= 2;
	for (auto e : array)
		cout << e << ' ';
}

int main()
{
	//int x = 10;
	//auto a = &x;
	//auto* b = &x;
	//auto& c = x;
	//cout << typeid(a).name() << endl;
	//cout << typeid(b).name() << endl;
	//cout << typeid(c).name() << endl;
	TestFor();


	return 0;
}

 

与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环

范围for的使用条件

1. for循环迭代的范围必须是确定的

对于数组而言,就是数组中第一个元素和最后一个元素的范围,对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。

注意:以下代码就有问题,因为for的范围不确定

void TestFor(int array[])
{
	/*int array[] = { 1,2,3,4,5 };
	for (auto& e : array)
		e *= 2;
	for (auto e : array)
		cout << e << ' ';*/
	for (auto& e : array)
		cout << e << endl;
}

迭代的对象要实现++和==的操作。(关于迭代器这个问题,以后会讲,现在提一下,没办法讲清楚)

指针空值

C++98中的指针空值

在良好的 C/C++编程习惯中,声明一个变量时最好给该变量的初始值,否则可能会出现不可预料的错误,比如未初始化的指针,如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化。

void TestPtr()
{
	int* p1 = NULL;
	int* p2 = 0;
}

NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码。

 #define NULL 0

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量,不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:

void f(int)
{
	cout << "f(int)" << endl;
}
void f(int*)
{
	cout << "f(int*)" << endl;
}
int main()
{
	f(0);
	f(NULL);
	f((int*)NULL);
	return 0;
}

 

这个是代码的运行结果,我们可以通过这段代码看到,形参那里接收的NULL是一个值

在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。

在C++11中,sizeof(nullptr)与sizeof(void*)0)所占的字节数相同。

为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/591808.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VmWare 虚拟机没有网络解决办法

由于最近需要&#xff0c;装了个VM虚拟机&#xff0c;但是突然发现本机有网络&#xff0c;虚拟机却没有网络&#xff0c;更换了虚拟机的网络设置&#xff0c;都尝试过了 都不管用&#xff0c; 最后尝试了这种方法完美解决 还原网络默认设置 首先还原虚拟网络编辑器设置 启动V…

力扣---二叉树的锯齿形层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,…

FFmpeg计算图像的SSIM的原理

SSIM算法基于HVS更擅长从图像中提取结构信息的事实&#xff0c;并且利用结构相似度来计算图像的感知质量。 在Z. Wang等人的论文Multi-scale structural similarity for image quality assessment中也提到&#xff0c; S S I M SSIM SSIM算法要好于当时的其它的感知图像质量指标…

Java-I/O-编写程序实现从文件中读取数据

定义一个类FileUtil&#xff0c;在FileUtil中定义一个方法 String readFromFile(File file)&#xff0c;该方法从指定的文件中读取数据&#xff0c;并将读取到的数据以字符串的格式返回。 FileUtil类的接口定义&#xff1a; class FileUtil{ String readFromFile(File file){…

强大而简洁:初学Python必须掌握的14个单行代码

Python的魅力与单行代码的重要性 Python&#xff0c;作为一种高级编程语言&#xff0c;自诞生以来就以其简洁、易读、易学的特性而广受开发者喜爱。其魅力不仅在于其强大的功能和广泛的应用领域&#xff0c;更在于其能够用简洁的代码实现复杂的功能&#xff0c;这种能力在很大…

nodejs实战——搭建websocket服务器

本博客主要介绍websocket服务器库安装&#xff0c;并举了一个简单服务器例子。 服务器端使用websocket需要安装nodejs websocket。 cd 工程目录 # 此刻我们需要执行命令&#xff1a; sudo npm init上述命令创建package.json文件&#xff0c;系统会提示相关配置。 我们也可以使…

matlab绘制时间序列图,横坐标轴如何标注为月-日

Excel表格中有类似于如下 年月日对应的数据 导入 matlab中&#xff0c;为数值矩阵&#xff1b;了解该表格中的时间跨度为从2021年1月2日至2021年12月31日&#xff0c;中间没有缺失&#xff0c;绘图代码&#xff1a; % clear; timespan1[20210102 20211231]; datenn1datenum(da…

Visual studio调试技巧

Visual studio调试技巧 bug是什么&#xff1f;Debug和ReleaseDebugRelease 如何调试VS调试快捷键调试过程中查看程序信息查看临时变量的值查看内存信息查看调用堆栈查看汇编信息查看寄存器信息 编译常见错误编译型错误链接型错误运行时错误 bug是什么&#xff1f; bug的英文释…

用例设计规范示例

一个好的用例设计&#xff0c;可以让任何一个执行测试的测试人员都能够容易理解&#xff0c;好操作、易执行、无歧义。这就需要有一个用例设计规范。 下面是一组用例设计规范的示例。 用例编号命名规范化 用例具有规范的、统一的、唯一的标识&#xff0c;有助于实现对用例的…

VMware | 虚拟机开启摄像头

VMware | 虚拟机开启摄像头 打开主机摄像头功能 首先请确保主机摄像头打开。 若图像显示正常则可以。 确保主机虚拟机USB服务开启 进入系统服务界面&#xff0c;确保 VMware USB … 处于开启状态&#xff0c;如果没开启&#xff0c;将它打开。 开启虚拟机摄像头 在 V…

以信息挖掘为关键技术的智慧校园建设

随着信息技术的快速发展&#xff0c;数据信息资源以井喷的姿态涌现。数据信息的大量涌现给人们带来丰富的数据信息资源&#xff0c;但面对海量的信息资源时&#xff0c;加大了人们对有效信息资源获取的难度&#xff0c;数据挖掘技术正是这一背景下的产物&#xff0c;基于数据挖…

C语言/数据结构——每日一题(分割链表)

一.前言 今天在LeetCode觉得很不错&#xff0c;想和大家们一起分享这道链表题——分割链表&#xff1a;https://leetcode.cn/problems/partition-list-lcci废话不多说&#xff0c;让我们直接进入正题吧。 二.正文 1.1题目描述 1.2题目分析 大致思路&#xff1a;我们可以通过…

手撸Mybatis(二)—— 配置项的获取

本专栏的源码&#xff1a;https://gitee.com/dhi-chen-xiaoyang/yang-mybatis。 配置项解析 在mybatis中&#xff0c;一般我们会定义一个mapper-config.xml文件&#xff0c;来配置数据库连接的相关信息&#xff0c;以及我们的mapperxml文件存放目录。在本章&#xff0c;我们会…

【C++】---模板进阶

【C】---模板进阶 一、模版参数1、类型参数2、非类型参数 二、模板的特化1、函数模板的特化2、类模板特化&#xff08;1&#xff09;全特化&#xff08;2&#xff09;偏特化 三、模板分离编译1、模板支持分离编译吗&#xff1f;2、为什么模板不支持分离编译&#xff1f;3、如何…

《21天学通C++》(第十五章)标准模板库简介

本章简单介绍STL容器、迭代器和算法的基本概念&#xff0c;之后几章会分别详述 1.STL容器 STL容器是STL中用于存储集合数据的组件&#xff0c;它们可以被看作是模板类&#xff0c;允许开发者定义特定类型的容器发&#xff0c;这里按照C11标准分为四类&#xff1a;顺序容器、关…

Vmware虚拟机瘦身及Samba服务不可用问题解决

虚拟机磁盘空间膨胀是一个令人头疼的问题&#xff0c;特别是对许多搞开发的小伙伴。无论是做后台服务、嵌入式还是Android开发&#xff0c;都面临着这个难题。首先&#xff0c;操作系统本身就已占用不少空间&#xff0c;更新安装包&#xff0c;再下载一些开源软件&#xff0c;剩…

leetcode_47.全排列 II

47. 全排列 II 题目描述&#xff1a;给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] …

Server 2022 IIS10 PHP 7.2.33 升级至 PHP 8.3 (8.3.6)

下载最新版本 PHP 8.3 (8.3.6)&#xff0c;因为是 FastCGI 执行方式&#xff0c;选择 Non Thread Safe(非线程安全)。 若有以下提示&#xff1a; The mysqli extension is missing. Please check your PHP configuration. 或者 PHP Fatal error: Uncaught Error: Class &qu…

41 POSIX信号量

POSIX信号量 POSIX信号量和System V信号量作用相同&#xff0c;都是用于同步操作&#xff0c;达到无冲突的访问共享资源目的&#xff0c;但POSIX可以用于线程同步 31节说了信号量&#xff0c;信号量的本质是一个计数器。将共享资源从一个整体划分为很多不部分&#xff0c;就和…

可视化大屏应用场景:智慧安防,保驾护航

hello&#xff0c;我是大千UI工场&#xff0c;本篇分享智慧安防的大屏设计&#xff0c;关注我们&#xff0c;学习N多UI干货&#xff0c;有设计需求&#xff0c;我们也可以接单。 实时监控与预警 可视化大屏可以将安防系统中的监控画面、报警信息、传感器数据等实时展示在大屏上…