C++基础之初始化、输入输出安全问题及常量问题

2023-11-12

一.C++统一初始化: 初始化列表 解决方案

例1:

int main()
{
   	int a = 10;
	int b = 10;
	int c{ 10 };//初始化列表

	int arr[10] = { 1,2,4,5,6 };
	int brr[10]{ 1,2,3,4,5,6 };
	int crr[]{ 1,2,3,4,5 };
	int drr[] = { 1,2,3,4,5 };

	int* ip = NULL;
	int* is{ NULL };

    return 0;
}

例1:

int main()
{
	int a = 12.23;//a=12
	//int b{12.23}//类型错误
	double dx{ 12.23 };
}

二.输入输出:

1.C 语言输入输出

#include<stdio.h>
int main()
{
    int a = 10;
    int b(10);
    int c{10};
    int arr[10] ={1,2,3,4,5,6,7,8,9,10};
    int brr[10]{1,2,3,4,5,6,7,8,9,10};
    scanf("%d %c",&a,&c);
    printf("a = %d ch = %c n",a,c);

    return 0;
}

scanf不安全的原因:内存访问越界

解决方法:

(1):加一个宏

#define_CRT_SECURE_NO_WARNINGS
(2):scanf_s:例如:
scanf_s("%10s %8s", string1, 11, string2, 9);
//string1可接受10个字符\0占一个空间

 

2.C++ 语言输入输出

// cin  input 输入流对象 , 键盘
// cout output 输出流对象 , 控制台(屏幕)
// >> 提取符
// << 插入符
// endl => '\n'; 换行符

#include<iostream>
using namespace std;
int main()
{
    char ch;
	int a;
	double dx;
	char str[20];
    cin >> ch >> a >> dx >> str;
	cout << ch << "\t" << a << "\t" << dx << "\t" << str << endl;
    //scanf_s(" % c % d % lf %s", &ch, &a, &dx, &str);//很麻烦类型,取地址符

    return 0;
}

//错误的使用方法
{
    //cin>>a,ch;
    //cout<<a,ch;
}

总结: 使用cout标准输出(控制台)和cin标

准输入(键盘)时,必须包含< iostream >头文件以及std标准命名 空间。endl 相当于 ' n';

#include<iostream>
using namespace std;
int main()
{
	const int n = 128;
	char str[n];
	cin >> str; // 输入 yhp hello this
	cout << str << endl; // yhp
	cin.getline(str, n); // yhp hello this
	cout << str << endl; // yhp hello this
	cin.getline(str, n, '#'); // yhp this # go to
	cout << str << endl; // yhp this;
	return 0;
}

三.const与指针

1.C语言中的const

int main()
{
	const int n = 10;//n以变量为主
	int arr[n]{ 1,2,3 };//会出现报错,因为数组大小为常量

    const int a = 10;//a仍然是变量,值可能还会被改
	int b = 0;
	int* ip = (int*)&a;
	*ip = 100;//a=100
	b = a;//b=100
	printf(" % d % d % d", a, b, *ip);//100 100 100
    
	return 0;
}

2.C++中的const

int main()
{
	//C++,a以常量为主
	const int a = 10;//a变成常量,看见a就替换成10
	int b = 0;
	int* ip = (int*)&a;
	*ip = 100;//a=10
	b = a;//b=10
	printf(" % d % d % d", a, b, *ip);//10 10 100

	return 0;
}

3.const 与指针的关系

int main()
{
	int a = 10, b = 10;
	int* p1 = &a; // 普通指针
	const int* p2 = &a; // 指向为常性(解引用为常性)
	int const* p2 = &a;
	int* const p3 = &a; // 指针变量自身为常性
	const int* const p4 = &a; // 指向(解引用)和指针变量自身都为常性
}
int main()
{
	int a = 0;
	int* p1 = &a; // ok;
	const int* p2 = &a; // ok;
	int* const p3 = &a; // ok;
	const int* const p4 = &a; // ok;
	return 0;
}
//编译方式不同

4.常变量与指针

int main()
{
	const int a = 10;
	int* p1 = &a; // error;
	const int* p2 = &a; // ok;
	int* const p3 = &a; // error;
	const int* const* p4 = &a; // ok;
	int* p5 = (int*)&a; // ok 不安全
	return 0;
}

5.同类型指针的赋值兼容规程

int main()
{
	int a = 10, b = 20;
	int* p = &a;
	int* s1 = p; // ok;
	const int* s2 = p; // ok;
	int* const s3 = p; // ok;
	const int* const s4 = p; //ok;
}

6.常见的例题

(1)

int main()
{
	int a = 10, b = 20;
	int* p1 = &a;
	*p1 = 100;
	p1 = &b;

	const int* p2 = &a;
	*p2 = 100;//错,*p2被const修饰,不能改变
	p2 = &b;

	int* const p3 = &a;
	*p3 = 100;
	p3 = &a;//错p3被const修饰,不能改变

	const int* const p4 = &a;
	*p4 = 100;//错
	p4 = &b;//错
    //都被const修饰,都不能改变

}

(2)

 int main()
{
    //全部编译通过
	int a = 10, b = 20;
	int* p = &a;//p是a的地址
	int* s1 = p;//指针s1=指针p,是a的地址
	const int* s2 = p;//指针s2=指针p,是a的地址,并且*s2也就是a不能改变
	int* const s3 = p;//指针s3=指针p,是a的地址,并且s3也就是a的地址不能被改变
	const int* const s4 = p;//指针s4=指针p,是a的地址,并且*s4也就是a不能改变且也S4就是a的地址不能被改变

	return 0;
}

(3)

int main()
{
	int a = 10, b = 20;
	const int* p = &a;//*p不能被改变,
	int* s1 = p;//error//因为*S1的改变会改变p的值,(p指向a的地址)不安全
	const int* s2 = p;
	int* const s3 = p;//error//因为*S3的改变会改变p的值,(p指向a的地址)不安全
	const int* const s4 = p;

	return 0;
}

(4)

int main()
{
    //全部编译通过
	int a = 10, b = 20;
	int* const p = &a;
	int* s1 = p;
	const int* s2 = p;
	int* const s3 = p;
	const int* const s4 = p;

	return 0;
}

总结: 能力强的指针赋值给能力收缩的指针

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础之初始化、输入输出安全问题及常量问题 的相关文章

  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • JS加减乘除位移方法封装

    常用加减乘除等方法汇总 直接上代码 逻辑简单 代码如下 div 加减乘除位移方法汇总 div
  • 轨迹预处理(轨迹压缩)

    轨迹压缩分为在线压缩和离线压缩两类 在介绍两类压缩算法之前 本文先介绍两种 距离度量 方法 第一种距离度量方法是 垂直的欧几里得距离 如图b所示 p1 p7 p12作为压缩后的点 垂直度量 则为做垂线计算 第二种距离度量方法是 时间同步的欧
  • Dynamics CRM2011 导入解决方案报根组件插入错误的解决方法

    今天在还原一个老版本的解决方案 在导入时报根组件插入问题 Cannot add a Root Component 38974590 9322 e311 b365 00155d810a00 of type 31 because it is n
  • android: ERROR: unknown virtual device nam

    环境变量 ANDROID SDK HOME your path 设置好就没有问题了
  • 刷脸支付服务商为各行各业提供完美体验

    随着刷脸支付技术迭代更新的速度加快 其商业化应用的步伐也越来越快了 4月17日 支付宝推出第二代基于线下消费场景的刷脸支付机具 蜻蜓2 0 定价1499元 同时 新一代蜻蜓还实现了刷脸注册会员卡的功能 切中了苦于获客高成本的线下零售门店的需
  • pve 使用noVNC num lock 不同步的问题

    问题描述 在使用 pve 的noVNC 控制台 访问 WINDOWS 虚拟机时 VM 会出现num lock 状态不同步的情况 主要是由于WINDOWS 笔者这里是 SERVER2022 启动后默认关闭了 num lock 而 pve的虚拟
  • Scala中的抽象类

    1 先看下 类的层次结构 类层次结构 也称为类分类法 是一组相关的类 它们通过继承连接起来做类似的事情 层次结构的顶部可以是一个基类 它下面的所有其他类都是从中派生出来的 或者层次结构可以有多个基类 这些基类的功能稍后会在一个或多个派生类中
  • 论文阅读-Multi-attentional Deepfake Detection

    一 论文信息 题目 Multi attentional Deepfake Detection 作者团队 会议 CVPR 2021 二 背景与创新 背景 之前大多数方法将deepfake检测模型作为一个普通的二分类问题 即首先使用骨干网络提取
  • Redis面试题

    1 基本概念 1 1 常见考点 1 Redis 为何这么快 1 基于内存 2 单线程减少上下文切换 同时保证原子性 3 IO多路复用 4 高级数据结构 如 SDS Hash以及跳表等 2 为何使用单线程 因为 Redis 是基于内存的操作
  • esp32 系列芯片分类

    模组 内置芯片 Flash PSRAM 模组尺寸 mm ESP32 WROVER PCB ESP32 D0WDQ6 4M 8M 18 00 0 10 x 31 40 0 10 x 3 30 0 10 ESP32 WROVER IPEX ES
  • 微信公众号一些错误的原因错误代码41001

    微信公众号一些错误的原因错误代码41001 错误代码41001 缺少access token 碰到这种错误 请检查自己的appid和appsecret posted on 2017 05 08 18 02 baker95935 阅读 评论
  • git如何上传所有的新文件

    目的描述 新建的git项目 项目中有许多要从本地上传到git仓库的新文件 如果用git a filename的方法一个一个的添加 太费事费力 需要有命令添加所有改动 步骤 进入项目文件夹 在其中使用git bash 1 使用git clon
  • MySQL和MongoDB那些事

    什么是 MySQL 和 MongoDB MySQL 和 MongoDB 是两个可用于存储和管理数据的数据库管理系统 MySQL 是一个关系数据库系统 以结构化表格格式存储数据 相比之下 MongoDB 以更灵活的格式将数据存储为 JSON
  • VC++ CSWDirectoryListCtrl磁盘文件列表

    效果图 头文件定义 CSWDirectoryListCtrl h pragma once include afxwin h include
  • leetcode 3. 最长不含重复的子字符串的五种解法

    leetcode链接 最长不含重复的子字符串 题目描述 给定一个字符串 s 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2
  • Android优化之启动优化和黑白屏优化

    文章目录 一 启动流程 1 开机启动流程 2 app启动流程 二 启动分类 三 黑白屏优化 1 写一个xml文件 activity welcome 2 welcomeActivity类 四 启动优化 1 获取启动时间 2 启动优化方向 一
  • Linux网络配置不生效

    关于解决Linux网络配置文件 修改不生效问题的解决方案 注意 外部问题 例如虚拟网卡 网段及网卡连通问题另行查找相关解决方案 本博客仅介绍比较生僻的Linux系统配置文件不生效有关问题 先看下产生的问题 修改为静态ip却不生效 我们按照正
  • 解决Echarts中双坐标轴分割错位问题

    1 处理函数 Description 刻度最大值 date 2023 08 30 param any isNaN maxValue 1 returns any export const getYAxisMax maxValue number
  • k8s yaml文件

    简介 YAML IPA j m l 尾音类似camel骆驼 是一个可读性高 用来表达资料序列的编程语言 YAML参考了其他多种语言 包括 XML C语言 Python Perl以及电子邮件格式RFC2822 Clark Evans在2001
  • C++基础之初始化、输入输出安全问题及常量问题

    一 C 统一初始化 初始化列表 解决方案 例1 int main int a 10 int b 10 int c 10 初始化列表 int arr 10 1 2 4 5 6 int brr 10 1 2 3 4 5 6 int crr 1