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++基础之初始化、输入输出安全问题及常量问题 的相关文章

随机推荐

  • 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