类型
基本类型:
数值类型:
整形:
1.短整型:short
2.整形:int
3.长整型:long
4.空类型:void
浮点型:
1.单精度型:float 有效位数6-7位,单精度数后需写f
2.双精度型:double 默认15-16位
字符类型:char
复合类型:
1.数组:[]
2.结构体:struct
3.共用体:union
4.枚举类型:enum
5.类:class
6.指针类型:*
c语言中没有bool c语言中用非0为真,以0代表假
cerr
- cerr不会写入缓冲区。直接输出。
字节
- 可寻址最小内存块称为“字节”,存储的基本单元称为“字(word)"
变量
- 变量是一个具有名字,可供操作的存储空间。
- 变量只能被定义一次,但是可以有多次初始化(extern)
初始化不是赋值
- 初始化是创建变量时赋予一个初始值。
- 赋值是把对象当前的值抹除,以一个新值替代
初始化列表
- {}初始化列表中的值类型必须相同。()则会自动转换
long double ld = 3.14; int a{ld};
报错long double ld = 3.14; int a{ld};
正确
初始化
- 定义在任何函数体之外的变量初始值都为0
- string除外。在任何地方初始化都为空串”“
引用和指针
-
引用必须初始化,初始化绑定后,一直绑定在一起,不可修改绑定
-
引用初始化类型必须相同(类型不同,初始化时会先创建一个临时变量。称为临时量。引用临时量,修改值,原来的值不会修改,故报错)
-
两种类型间指针赋值类型必须相同。不能将double类型指针赋给int类型指针
-
NULL 是预处理变量。值为0
int zero = 0; int *pi; pi = zero; //错误,不能把int变量直接赋给指针 pi = 0; //正确,空指针
-
void*类型指针不能被直接操作,因为不知道具体类型,不知道这个对象有些什么操作
-
int *p; int *&r = p; //r是一个对指针引用p的引用
-
解析类型从离变量最近的修饰符开始。从右到左
const
- const
const int i = get_size();//正确,运行时初始化
const int j=42;//正确,编译时初始化
const int k;//错误,k是一个未经初始化的--常量
- const和引用
const int ci=1024;
const int &r1=ci;//正确,引用及其引用对象都是常量
r1 = 42;//错误,r1是对常量的引用
int &r2=ci;//错误,试图让一个非变量引用指向一个常量对象
const int &r3 = 42;//正确,r3是一个常量引用
- 顶层和底层const
顶层:表示本身是个常量(指向常量的指针)
const double pi = 3.14;
double *ptr = ≺//错误,ptr是一个普通指针
const double *cptr=π//正确,cptr是一个指向double常量的指针
*cptr = 42;//错误
底层:表示指向的对象是一个常量(常量指针)
const int ci=42; const int &r = ci;//用于声明的const都是底层const
对常量对象取地址是一种底层const
int errNumb = 0;
int *const currErr = &errNumb;//currErr将一直指向errNumb
const double pi=3.14;
const doubele *const pip=*pi;//pip是一个指向常量对象的常量指针
constexpr变量
- constexpr int sz = size(); //只有当size()是一个constexpr函数时,才是一条正确的声明语句。不然报错
- 指针和constexpr
const int *p=nullptr;//p是一个指向整型常量的指针
constexpr int *q=nullptr;//q是一个指向整数的常量指针
----》constexpr把它所定义的对象置为顶层const
constexpr int *np = nullptr;//指向整数的常量指针。值为空
int j=0;
constexpr int i=42;//i的类型是整型常量
//i和j都必须定义在函数之外
constexpr const int *p=&i;//p是常量指针,指向真相常量i
constexpr int *p1=&j;//p1是常量指针,指向整数j
decltype类型指示符
- 解引用指针可以得到指针所值的对象,而却还能给这个对象赋值,因此decltype(*p)的结果类型是int&,而非Int
- decltype((variable))------>双层括号---结果永远是引用
- 返回类型---》包括顶层const
- auto---》会忽略顶层const
- 必须牢记decltype用于某个函数时,它返回函数类型而非指针类型(函数指针),因此需要显示的加上*表示我们需要返回指针,而非函数本身
string
string初始化方式
core | 解析 |
---|---|
string s1 | 默认初始化,s1是一个空串 |
string s2(s1) | s2是s1的副本 |
string s2 = s1 | 等价于s2(s1) |
string s3("value") | s3是字面值”value"的副本,除了字面值最后的空字符外 |
string d3="value" | 等价于s3("value") |
string s4(n,'c') | 把s4初始化为由连续n个字符c组成的串 |
string操作
方法 | 解释 |
---|---|
os<<s | 将s写到输出流os当中,返回os |
is>>s | 从is中读取字符串赋给s,字符串以空白分隔,返回is |
getline(is,s) | 从is中读取一行赋给s,返回s |
s.empty() | s为空返回true,否则返回false |
s.size() | 返回s中的字符个数,不含最后的空字符,返回类型string::size_type |
s[n] | 返回s中第n个字符的引用,位置n从0计起 |
s1+s2 | 返回s1和s2连接后的结果 |
s1=s2 | 用s2的副本代替s1中原来的字符 |
s1==s2 | 如果s1和s2中所含的字符串一样,则相等,反之不相等---》大小写敏感 |
<,<=,>,>= | 利用字符在字典中的顺序进行比较,且对字母的大小写敏感 |
切记
- 字符串字面值与string是不同的类型
string str = ("hello"+",")+str2;//错误,不能把字面值直接相加
- 字面值:不能改变的值,如数字,字符,字符串等等。
cctype函数
- 字母与数字
函数 | 判别的字符类型 |
---|---|
isalnum(c) | 当c是字母或者数字时为真 |
isalpha(c) | 当c是字母时为真 |
iscntrl(c) | 当c是控制字符时为真 |
isdigit(c) | 当c是数字时为真 |
isgraph(c) | 当c不是空格但可以打印时为真 |
islower(c) | 当c是小写字母时为真 |
isprint(c) | 当c是可打印字符时为真(即c是空格或者c具有可视形式) |
ispunct(c) | 当c是标点符号时为真(即c不是控制字符,数字,字母,可打印空白中的一种) |
isspace(c) | 当c时空白时为真(即c是空格,横向制表符,纵向制表符,回车符,换行符,进纸符中的一种) |
isupper(c) | 当c是大写字母时为真 |
isxdigit(c) | 当c是十六进制数字时为真 |
tolower(c) | 如果c是大写字母,输出对应的小写字母;否则原样输出 |
toupper(c) | 如果c是小写字母,输出对应的大写字母;否则原样输出 |
vector
- 初始化
vector<int> v1{a,b,c,...}
vector<int> v2={a,b,c,...}
其他和string一样
注意1
vector<string> v1{"hi"};//初始化正确
vector<string> v2("Hi");//错误,不能直接使用字符串字面值构建vector对象
注意2
vector<int> v2(10,1);--》10个1,10个值
vector<int> v2{10,1};--》一个10,一个1,两个值
- 方法
size():和string一样,返回类型注意一下,也是size_type.当作用域不同,vector
::size_type--->不是vector::size_type empty()
....和string重合---》os<<v;is>>v;不同
v.push_back(t) 向v的尾端插入值为t的元素
迭代器
- 如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器
- 迭代器间的距离:类型difference_typed,带符号整数,距离可正可负。string和vector都定义了这个类型
操作
支持:*iter iter->mem ++iter --iter iter1==iter2 iter1!=iter2;
谨记
但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。添加元素,迭代器对象失败,但可以重新获取插入后的迭代器