C++的数据及操作

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,<<,将输入的数据,写入至文件
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值