C++备忘知识整理
一、设置字体颜色
C++控制台程序运行时输出框默认的文字颜色是白色,所以我常称其输出框为黑白框。但是这个文字样式不是固定不变的,是可以改变颜色的字体的。方法有两种:
1、设置输出框的框体属性。在运行时弹出的输出框标题栏上点击右键设置它的属性,可以调节输出框的大小、背景色、文字颜色等属性。但是这种设置只能在自己的机子上运行显示。在其他人的机子上是没有用的。这里不做重点介绍。
2、用代码修改。这里介绍C++中用代码修改输出框显示文字的颜色。具体代码是调用一个函数SetConsoleTextAttribute(参数表)。
SetConsoleTextAttribute()函数是一个API设置字体颜色和背景色的函数。参数表中使用两个属性(属性之间用,隔开)。GetStdHandle()和FOREGROUND_*或BACKGROUND_*。*值为INTENSITY或RED或GREEN或BLUE。第一个属性获得句柄(即要设置颜色的地方),第二个属性设置颜色。属性相加是在属性值中间加“|”隔开即可。
GetStdHandle(STD_OUTPUT_HANDLE)获得句柄。
FOREGROUND_INTENSITY 表示设置前景色为高亮显示。
FOREGROUND_RED 表示设置前景色为红色,即字体颜色为红色。
FOREGROUND_GREEN 表示设置前景色为绿色,即字体颜色为绿色。
FOREGROUND_BLUE 表示设置前景色为蓝色,即字体颜色为蓝色。
BACKGROUND_INTENSITY 表示设置背景色为高亮显示。
BACKGROUND_RED 表示设置背景色为红色。
BACKGROUND_GREEN 表示设置背景色为绿色。
BACKGROUND_BLUE 表示设置背景色为蓝色。
…… …… …… …… …… ……
说明:在使用时要在预处理中包含window.h头文件
举例如下:
#include #include"windows.h" using namespace std; void main() { cout<<"原色testCOLOR(没有设置字体颜色)"<<endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED| FOREGROUND_GREEN|FOREGROUND_BLUE);//设置三色相加 cout<<"白色testCOLOR(红色绿色蓝色相加)"<<endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED); //设置红色 cout<<"红色testCOLOR(设置的颜色为红色)"<<endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN) ;//设置绿色 cout<<"绿色testCOLOR(设置的颜色为绿色)"<<endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE); //设置蓝色 cout<<"蓝色testCOLOR(设置的颜色为蓝色)"<<endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED| FOREGROUND_GREEN);//设置红色和绿色相加 cout<<"黄色testCOLOR(红色和绿色相加色)"<<endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED| FOREGROUND_BLUE);//设置红色和蓝色相加 cout<<"粉色testCOLOR(红色和蓝色相加色)"<<endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN| FOREGROUND_BLUE);//设置绿色和蓝色相加 cout<<"青色testCOLOR(绿色和蓝色相加色)"<<endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY); //设置颜色,没有添加颜色,故为原色 cout<<endl; }
二、C++中内存模型的几种存储说明符
关键字提供的存储说明符有auto , register, static ,extern,mutable,C-V限定符有const和volatile.
1.auto用在将变量声明为自动变量,就是留出一段内存,成为堆栈,以管理变量的增减,这个过程是自动完成的.
2.register关键字用来声明局部变量.寄存器变量是存储持续性为自动的,能提供对变量的快速访问,但是分配空间与回收都取决与CPU.如果该变量被频繁使用,就请声明为register变量.
3.static 静态变量.未被初始化的静态变量一般都被设置成0,只能用常量表达式来初始化静态变量.可以使用const常量和enum常量以及sizeof操作符,static变量将被分一块独立的内存空间.
4.extern 重新定义以前定义过的外部变量,该变量将自动隐藏定义过的外部变量.
5.const 表明程序对他进行初始化以后,便不能再被修改了.
6.volatile .即使程序代码没有对内存但愿进行修改,其值也可能发生变化.
7.mutable 即使结构或者类变量为const.其某个成员也可以被修改。
三、函数指针与指针函数
//指针函数是指返回值是指针的函数,即本质是一个函数:
#include<iostream>
using namespace std;
int main()
{
float*find(float(*p)[],intm);//查询序号为m的学生的四门课程的成绩
float score[][]={{,,,},{,,,}, {,,,}};//定义成绩数组,第一维可以为变量
float*pf=NULL;//定义一个指针时一定要初始化
int i,m;
cout<<"请输入您想查询的学生的序号:";
cin>>m;
pf=find(score,m);//返回为一维数组指针,指向一个学生成绩
for(i=;i<;i++)
cout<<*(pf+i)<<"";
cout<<endl;
return ;
}
float *find(float(*p)[],intm)
{
float *pf=NULL;
pf=*(p+m);//p是指向二维数组的指针,加*取一维数组的指针
return pf;
}
学生学号从0号算起,函数find()被定义为指针函数,其形参pointer是指针指向包含4个元素的一维数组的指针变量。pointer+1指向 score的第一行。*(pointer+1)指向第一行的第0个元素。pf是一个指针变量,它指向浮点型变量。main()函数中调用find()函数,将score数组的首地址传给pointer.
这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。
四、数组指针与指针数组
指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
数组指针:a pointer to an array,即指向数组的指针
还要注意的是他们用法的区别,下面举例说明。
int* a[4] 指针数组
表示:数组a中的元素都为int型指针
元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*
int (*a)[4] 数组指针
表示:指向数组a的指针
元素表示:(*a)[i]
注意:在实际应用中,对于指针数组,我们经常这样使用:
typedef int* pInt;
pInt a[];
#include <iostream> using namespace std; int main()
{
int c[]={,,,};
int *a[]; //指针数组
int (*b)[]; //数组指针
b=&c;
//将数组c中元素赋给数组a
for(int i=;i<;i++)
{
a[i]=&c[i];
}
//输出看下结果
cout<<*a[]<<endl; //输出2就对
cout<<(*b)[]<<endl; //输出3就对
return ;
}
注意:定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是,不给b地址,直接用(*b)[i]=c[i]给数组b中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,但运行时肯定出现问题,使用指针时要注意这个问题。但为什么a就不用给他地址呢,a的元素是指针,实际上for循环内已经给数组a中元素指定地址了。但若在for循环内写*a[i]=c[i],这同样会出问题。总之一句话,定义了指针一定要知道指针指向哪里,不然要悲剧。
五、几种容器比较
1.vcetor
六、C++几种类型转换
C++备忘知识整理的更多相关文章
- 最好的前端API备忘单整理
注:这份表引自The best front-end hacking cheatsheets - all in one place Javascript ES2015 Cheatsheet JavaSc ...
- JVM内存知识备忘
又是一篇备忘... 主要记录一些知识,进行一些资源的汇总. 先来群里liufor大大提供的两张图,清晰易懂: Dockerized Java https://www.youtube.com/watch ...
- GIS部分理论知识备忘随笔
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...
- Mysql又一次整理笔记--woods备忘
==============================SQL备忘 CRUD 查询 多表 事件等=============================== ------------------ ...
- JavaScript基础知识整理
只整理基础知识中关键技术,旨在系统性的学习和备忘. 1.在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,而 undefined 的操作象特殊值NaN ...
- 工作效率-十五分钟让你快速学习Markdown语法到精通排版实践备忘
关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...
- Kali Linux渗透基础知识整理(四):维持访问
Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...
- Nmap备忘单:从探索到漏洞利用(Part 5)
这是备忘单的最后一部分,在这里主要讲述漏洞评估和渗透测试. 数据库审计 列出数据库名称 nmap -sV --script=mysql-databases 192.168.195.130 上图并没有显 ...
- Nmap备忘单:从探索到漏洞利用(Part 4)
这是我们的Nmap备忘单的第四部分(Part 1. Part 2. Part 3).本文中我们将讨论更多东西关于扫描防火墙,IDS / IPS 逃逸,Web服务器渗透测试等.在此之前,我们应该了解一下 ...
随机推荐
- SPDY和HTTP
SPDY 是什么 ? SPDY 是 Google 开发的基于传输控制协议 (TCP) 的应用层协议.SPDY 协议旨在通过压缩.多路复用和优先级来缩短网页的加载时间和提高安全性.(SPDY 是 Spe ...
- Centos 7 系统安装(简单步骤)
前面步骤忽略.进入安装步骤. 运行安装 到选择语言的时候最好选英文版,这里做模板,用的中文版 接着下一步到安装选项 在日期和时间里,选择上海时区 紧接着进行软件安装选择,如图安装就好 接着进行分区,也 ...
- 类中调用界面ActiveX控件报错当前线程不在单线程单元中因此无法实例化 ActiveX 控件的解决办法
解决办法是Form类中定义一个静态的ActiveX对象,在formload中将界面上的ActiveX对象赋值给新定义的对象,类中访问该静态对象即可. public static AxClientDri ...
- css flexbox 弹性布局
flexbox 即css flexible box layout. ie9及以下不支持flexbox. flex详细规范(https://www.w3.org/TR/css-flexbox/) 为什么 ...
- OGC 的 WMS、WFS 及WCS服务(转)
OGC——Open Geospatial Consortium——开放地理信息联盟,是一个非盈利的志愿的国际标准化组织,引领着空间地理信息标准及定位基本服务的发展目前在空间数据互操作领域,基于公共接口 ...
- Windows API 编程----将错误代码转换成错误描述信息
Windows编程有时会因为调用函数而产生错误,调用GetLastError()函数可以得到错误代码.如果错误代码为0,说明没有错误:如果错误代码不为0,则说明存在错误. 而错误代码不方便编程人员或用 ...
- 云栖神侠传—阿里云数据库专家德歌告诉你PostgreSQL的那些事
什么是云栖神侠传: 云栖社区(http://yq.aliyun.com/?utm_source=yqdg),是阿里云面向开发者群体的开放型社区.在云栖社区中,活跃着许多阿里技术大牛,他们在自己的技术领 ...
- Java—IO流 字符流
java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码). 文件是byte byte byte ... 的数据序列. 文本文件是文本(char)序列按照某种编码方案(uf ...
- nlinfit非线性回归拟合
% % 使用指定函数对下述两变量进行曲线拟合 % % y=a+k1*exp(m*t)+k2*exp(-m*t); % % 离散点: t=[0,4,8,40], % % y=[20.09,64.5 ...
- GitHub教程(二) 删除已有仓库
通过GitHub教程(一)的阅读,我相信您对GitHub体系框架已经有了模模糊糊的了解.本节教程将继续介绍GitHub的操作---删除仓库. 作为GitHub的入门使用者,我们可能会建一些简单的仓库来 ...