第三章:
1,sozeof(int); int n_int=INT_MAX; sizeof n_int;(对变量括号可选)
2,#include<climits>包含一些类型的最大值
3,count 默认显示十进制, cout<<dec(默认) count<<hex count<<oct
4,bool, char, short, int, long, longlong, float, double, long double
5,count.setf(ios_base::fixed,ios_base::floatfield)//防止大的数切换到E表示法,显示小数点后6位小数(保留0)
6,C++风格 typeName(value)
7,变量初始化 int wren(23); int wren=23;
8,C++ const和#define区别:
(1)const 编译阶段使用,define是在预处理阶段展开;
(2)const可以指定类型,做安全检查,而define没有
(3)const可以在限定在指定区域
(4)const用于更复杂的类型,数组,结构体(大对象要分配内存,或extern声明或对其取地址时也要分配内存)
(5)const常量定义基本类型时放在符号表中(堆或栈),而define仅仅是展开,不分配内存
9常量的类型:L,l; U,u; ul,UL;
10 类型转换 float运算不提升为double,int型整数被赋给float时截取小数
***常量折叠:#define和const,const定义常量,你不能尝试通过更改变量的值去改变它,但是可以通过引用它的地址来改变,即通过指针。常量折叠说的是,在编译阶段,对该变量进行值替换,同时,该常量记录在符号表中,和define还不一样,有三种情况下,会为const分配内存。
实例:#include<iostream>
int main()
{
using namespace std;
const int i=20;
int *p=(int *) &i;//改变i内存地址上的值
*p=10;
cout<<(int *)&i<<":"<<i<<endl;//这个i在编译阶段已经被20给替换了
cout<<p<<":"<<*p<<endl;
return 0;
}
结果显示0012FF44:20
0012FF44:10
第四章:
1,数组只能定义时初始化,int hand[500]={0},此后只能单个单个元素赋值; 不能数组间赋值
初始化数组为{1}时,只有第一个元素是1,其它置0
a=int[10];sizeof a 数组字节数10*4; sizeof a[0] int类型字节数4
2,字符串数组 char cat[5]="C+owby"或 char cat[]="....."; count<<cat打印字符串,而非地址;
3,字符串输入:cin通过空白(space,\b,\n)来定界,不能读空格;
cin.getline(name,20),遇到\r,\n停止,丢弃换行符,最多读19个char;
cin.get(name,20).get()或name=cin.get();cin.get();cin.clear()
* 用cin>> 连续读入时,注意每次读入字符或数字时,cin,get()或者(cin>>value).get()处理掉字符流中的回车生成的\n
4,读数字 cin>>year;cin.get()处理空行,防止阻断输入
5,#include<string> string类在名称空间std中 使用前必须声明useing namespace std;
和字符串数组不同,相互赋值:str1=str2; 拼接:str1+=str2;读入:getline(cin,str1)(这是个函数,不是cin的类方法)
6,对比#include<cstring>,
void strcat(char *t,char *s){ while(*t++=*s++);}字符串拼接
strcpy(char *t,char *s);
字符串长度:string类方法 len=str1.size()(不计‘\0‘), 字符串数组 len=strlen(charr1)(cstring 中的函数,不计\0)
读入方法: 字符串数组 cin.getline(name,20), string:getline(cin,str1);
7,struct 可以相互赋值, 成员分隔定义时用;赋值时用,可以整体赋值,可以结构数组
8, union, enum spectum{oen,two=0,three=8,four};spectum myflag=one;
9,指针:使用前一定要有指向地址!cha c=‘a‘,*p=&c; (int*)强制转换为两个字节的地址类型,(double*)四个字节
10,new/delete 和malloc/free比较:
new/delete是操作符,而malloc/free是库函数,都是用于申请动态内存和释放动态内存的
对非内部数据类型的对象而言,malloc/free不能执行构造函数和析构函数,注定只能用于C
而new/delete可以胜任
11,new/delete条例:内存耗尽返回0(null pointer)可以被释放;不是new开辟的内存就不要用delete去释放;一个地址只能 释放一次,无论多少指针指向它
12,指针和数组名:基本相同,根本区别:数组名是指向第一个元素的地址常量,不能被赋值!
指针或数组名加1是指向下一个地址块,即下个元素
13,cout的智能化:cout<<array;array是数组名,cout自动辨别是否为字符串数组(试了下,char数组就可以,比如字符数组char array[]=[‘a‘,‘b‘,‘ ‘,‘c‘]也可以)或string或char*,若是打印数组内容;其它则打印数组首元素地址
1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 5 using namespace std; 6 int main() 7 { 8 string str1="hello"; 9 cout<<str1;//打印字符串内容 10 char array[]="hello word"; 11 12 cout<<endl<<array<<endl;//打印字符串数组内容 13 int mm[6]={0,1,2,3,4,5}; 14 cout<<mm<<endl;//打印整型数组地址 15 16 char c=‘a‘,nn[]={‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘}; 17 cout<<"nn is:"<<nn<<endl;//打印字符型数组内容,但是由于n[4]后面的没有初始化,乱码 18 char *p1=new char[strlen(nn)+1]; 19 cout<<"strlen:"<<strlen(nn)<<endl;//strlen只是针对字符串数组有用!!12是怎么来的? 20 strcpy(p1,nn); 21 cout<<p1<<endl;//同打印nn一样,后面未初始化的依然乱码 22 cout<<*p1<<endl;//首个元素内容 23 24 char vv[20]="hello word!!!"; 25 cout<<vv<<endl; 26 cout<<"strlen:"<<strlen(vv)<<endl; 27 char *p2=new char[strlen(vv)+1];//这次可以了 13 28 strcpy(p2,vv); 29 cout<<p2<<endl;//打印出hello word 30 delete [] p1; 31 delete [] p2; 32 return 0; 33 34 }