C++的数据及操作
文章目录
基本数据类型:
**变量名不占用内存:**如int a=12
a是你创造变量的代号,让你能看明白你写的代码,但是编译器编译时就不用这个代号了,而是分配给它一个机器能看懂的代号(也就是地址),地址的长度是一定的,和你之前用的代号长度无关;但是12会占用4字节内存
可以使用sizeof查看变量名或者类型,前者括号可省略
特别注意各种数据类型的最大值限制,避免数值的溢出!!
- int型(占用4字节) 整数是完全精度的,不存在舍入误差
- char类型(占用一个字节)
- float及double类型(占用4及8字节) 永远不要直接比较两个浮点的大小,存在舍入误差,浮点数精度丢失问题,在某个精度点直接舍弃。
- bool类型(占用1字节)
派生类型:基于基本类型创建
-
指针类型(占用8字节)
//面向对象和面向过程的重要区别在于,oop强调在运行阶段进行决策,分配数组内存,而非声明编译阶段直接先分配内存,只需使用new动态分配数组长度,并使用指针用来跟踪这块内存即可!! //指针初始化,只能用地址赋值,而不能使用数值直接赋给指针 int a=10; int *p1; int *p2=&a; p1=p2; int *p3=10;//出现错误!! *p3=10;//表示修改p3指向的值,而非指针 //注:不能再没有初始化指针指向的情况下,直接对指向值赋值 int *p4; *p4=10;//出现错误,p4没有初始化指向 //指针与数组名区别在于,指针可以进行算术加减 //使用未初始化的指针访问内存或者试图释放同个内存两次,都将导致程序崩溃!!
-
数组类型 //可以初始化赋值,但是一旦初始化就不能数组间直接赋值操作,只能通过数组下标来赋值
-
string类型(占用8字节)
//C++处理字符串的两大方式 //第一种:使用字符数组 char bird[11]="my bird"; //自动添加'\0'空字符结束符 char bird[]="Bubbles";//只需要记住计算字符数组长度一定要加上空字符'\0' const int SIZE=20; cin>>name; //cin表示读取并清除输入队列中非空白字符,遇到空白字符停止读取,会保留换行符即空白符在输入队列之中 cin.get(name,SIZE);//表示读取并清除指定字节(含空白字符),遇到换行符或者空白字符停止读取,会保留换行符即空白符在输入队列之中 cin.get();//为了读取并清除换行符,保证输入队列数据为空 cin.get(name,SIZE).get(); cin.getline(name,SIZE);//表示读取并清除指定字节(含空白字符),遇到换行符或者空白字符停止读取,丢弃换行符在输入队列之中 //想要再次输入数据,必须保证输入队列中一个字符数据都没有,包括换行符!! //使用cin.clear()直接清空输入队列数据 cin.clear()//用于输入出现错误,将状态恢复正常,并重新开启cin输入 //应用: #include <iostream> using namespace std; int main(){ int year; cin>>year; char address[20]; cin.getline(address,20); cout<<year<<"\n"<<address; }// 输出2018,address根本没有机会输入数据,原因在于cin>>year时,你的换行符被保留在了输入队列之中,输入getline时被认为是一个空行,从而输出一个空字符串,即没有显示任何东西!! //解决办法,在cin>>year;加入cin.get();表示使用get读取并清除输入队列中的换行符 strcpy(chr1,chr2);//复制字符数组 strcat(chr1,chr2);//链接字符数组 //第二种:使用string类 string str1="yang gfdg"; string str2; str2=str1;//可以直接赋值操作 string str3=str1+str2;//可以直接拼接合并 str2+=str1;//可以直接尾部连接
-
结构体struct类型
//自定义多种数据类型 struct book{ char b_name[20]; float b_price; char b_author[20]; }; //结构数组 book mybook[20]={ {"C++",21.32,"yang"}, {"java",43.5,"xu"} };//定义一个book数据结构的数组并初始化
-
union共用体类型 //区别于struct,可以存储不同数据类型,但只能同时存储其中一种,而struct可以同时存储!!
-
class类型
-
function类型,即函数
-
枚举类型enum
-
空类型void,空类(均占用1字节,作为区别地址)
组合类型
指针数组和数组指针
int (*p1)[10];//表示一个指向10个元素数组的指针
int* p2[10];//表示含有10个int型的指针数组
cout<<sizeof(p1)<<'\n'<<sizeof(p2);
//输出结果 8 80
函数指针
//与数组相似,函数名也是指向函数第一条指令的常量指针。所以说函数的调用可以通过函数名,也可以通过指向函数的指针来调用。函数指针还允许将函数作为参数传递给其他函数,也就是回调函数。
常量指针和指针常量
//千万记住const是一个对左边有效的关键字!!!!
//指针:
char *p;//指针p只能给其赋值 必须为相应指向类型变量或者常量的地址,不能直接赋予数值
char *q;
//区分 :通过指针修改它指向变量的值:前提指向的不是常量*p='10';
// p->a='10';
//常量指针实例
int a=10;
const int *p=&a;
*p=11; p->a=11;//出现错误
//指针常量实例
int b=11;
int a=10;
int *const p=&a;//不要写成int const *p=&a;由于const对左边有效,所以这是一个常量指针
p=&b; //出现错误,试图修改一个指针常量的指向
//只要定义了一个指向常量的指针,不论它是否指向常量还是变量,都不能通过这个指针改变它指向的值 //修改指针的指向:前提不是常量指针 p="wang"; //修改指向为一个常量串首地址
参考博文:https://blog.csdn.net/erica_ou/article/details/80809543
https://www.cnblogs.com/mq0036/p/3382732.html
数组的替代品vector及array
- vector类 //可用于替代new创建的动态数组,其实就是一个自动new和delete的封装模板类,存于堆区
#include <vector>
using namespace std;
int main(){
vector<int> a1;//表示创建一个0的数组,可以动调整大小
const int SIZE=20;
vector<double> a2(SIZE); //表示创建一个SIZE大小的double数组
}
-
array类 // 静态固定长度数组,存于栈区,可以进行数组间的赋值操作
#include <array> using namespace std; int main(){ array<int,5> a1;//表示创建一个5的数组,可以动调整大小 const int SIZE=20; array<double,SIZE> a2; //表示创建一个SIZE大小的double数组 }
类型转换
运算符优先级
分配内存的方法
自动存储
放置在栈区,调用函数时,分配内存,函数调用结束,内存即被释放,先进后出,栈不断增大与缩小
静态存储
使用关键字static,放置与data,bbs区
动态存储
使用new及 delete,将数据放置在堆区,先进先出,若是没有调用delete,指针内存由于作用域而被释放,但堆区的内存仍然存在,造成内存泄漏,泄漏的内存将在程序存在的整个时间都无法使用,容易导致程序内存耗尽,开始崩溃crash
数据的操作:哪种数据结构在时间和空间上操作最优?
-
输入存储,如何设计数据存储结构----涉及数据结构的方方面面的知识
#include <iostream> using namespace std; int main(){ char ch; int count=0; // cin.get(ch);//开始读取输入的流,读取成功,则放入ch中,失败则返回false,并关闭输入 // while(cin.fail()==false){ //如果输入流错误,执行循环,直到遇到最后一个字符,读取成 // // 功,跳出循环 // cout<<ch; // ++count; // cin.get(ch);//读取下一个输入流字符 // } //直接改为 while(cin.get(ch)){ cout<<ch; ++count; } //先调用cin.get(ch),成功返回true,得到cin,在进行bool转换为true,开始调用一次,结束调用一次,直到碰到换行符调用cin.get(ch)失败,跳出循环!! cout<<"\n"<<count<<"\n end"; }
-
分析合并
-
读取显示
-
修改,推断
-
查询,遍历
-
插入,删除
-
特定匹配
-
数据计算
控制台的输入与输出操作对象cin与cout,iostream头文件,类ostream,istream
- 使用cin的>>,get,getline从输入流中读取数据
- 使用cin,eof(),fail()判断输入是否成功
- 使用cout及<<显示数据
文件的输入与输出操作对象infile与outfile,头文件ostream,fstream,类ofstream,ifstream
- 使用infile.close()及open()关闭和关联打开文件
- 使用infile.get(),>>,getline()读取数据
- 使用eof(),fail()判断输入是否成功
- 使用outfile.close()及open()关闭和关联打开文件
- 使用outfile,<<,将输入的数据,写入至文件