《C++ Primer Plus 第6版》读书笔记
知识点:
1.C++数组初始化 可以省略“=”
int lift[10] {1, 2, 4}; 等价 int lift[10] = {1, 2, 4};
int lift[10] {}; //等于 {0}
2.'S' 是83的另一种写法。“S” 表示 S和\0 并且“S” 表示的为地址
3.键盘输入读取一行处理
cin.getline(name1, 19); 读取一行输入,丢弃换行符,自动结尾加空字符
cin.get(name1,19);读取一行输入,保留换行符,自动结尾加空字符
cin.get(); //是读取一个字符 可用于读取回车
cin.get(name1,19).get(); //可用于读取字符串,并读取回车
4.字符串操作(string)
string str1, str3;
string str2 = "Hello World!";
str1 = str2;
str3 = str1 + str2;
str1.size();
5.长字符串
wchar_t name1[] = L"Hello World";
char16_t name2[]=u"Hello World";
char32_t name3[]=U"Hello World";
6.原始字符串
cout << R"(I love you "King" to "\n" for sec)"<<endl;
打印:I love you "King" to "\n" for sec
打印“(方法:
cout << R"+*(I love you "King" to "\n" for sec)+*"<<endl;
7.C++不提倡使用全局变量
8.结构体复制
struct sname1{
char name[20];
int value;
}
struct sname2{
char name[20];
int value;
}
sname1 spt{"Lilei", 30}; //初始化 如果只有{} 初始化为0sname2 = sname1;
9.结构中的位字段
struct sname2{
unsigned int SN : 4; //占4位
unsigned int : 4; //占4位,空位
bool goodin :1;
bool goodtorgle :1
}
sname2 tr = { 14, true, false}; //初始化
10.作用域内枚举
enum EN{ red = 0, green = 10, blue= 20};
EN bis;
bis = EN(19); // 这是合法的, 19属于枚举区间内 0 ~ 31。 离20最近的2的幂为32,32 -1 就是枚举的上限。下限算法相同
11.OOP强调运行阶段决策,即运行时决定分配多少所需的空间。
12.给指针复制,必须强制类型转换
int *p;
p = (int *)0xB8000000;
13.指针与变量的大小
double *pn = new double; //double 为8字节
*pn = 0.0001
sizeof(pn), sizeof(*pn).
打印: 4 8
14.new 分配的空间是堆,这点显而易见。new 和 delete 成对出现
15.数组分配空间
int *p = new int[20];
delete [] p;
16.delete 不应对一个指针释放两次,对空指针delete两次是安全的
17.指针和数组等价
int *p = new int[20];
p[3] = 5;
p = p +1; //P指向第二个元素,指针地址增加了4个字节,指针会根据指针类型的长度增加地址
delete [] p;
18.数组名与指针
short tell[10];
cout << tell << endl; //数组名为第一个元素的地址
cout << &tell << endl; //数组名取地址是整个数组的地址
//虽然地址相同,但是+1的结果不同,
cout << tell + 1 << endl; //数组名为第一个元素的地址,加两个字节
cout << &tell + 1<< endl; //数组名取地址是整个数组的地址,加20个字节
//tell 等价于 &tell[0] 这是一个两字节的内存地址, tell+1 地址值加2. tell是一个 short * 指针
//&tell 是一个20字节的内存地址 &tell +1 地址值加20。&tell 是 short (*)[10]数组。
//初始化指针 short (*pas)[20] = &tell //括号不能省略,不然pas先与[20]结合,变成指针数组,包含20个元素。
//(*psa)[0] 第一个元素
打印结果:
0021FA28
0021FA28
0021FA2A
0021FA3C
19.数组名是第一个元素的地址
20.cout 会打印指针地址,但如果指针是 char * 则会打印指针指向的字符串,需要强制转换来打印char *的地址 (int *)
21.自动存储的变量放到栈(后进先出LIFO)中,反向被释放。栈将不断变大和缩小。
22.指针的指针,数组与指针
#include "stdafx.h"
#include <iostream>
struct times
{
int year;
};
int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;
times ss[3];
ss[0].year = 100;
(ss + 1)->year = 101; //等同于 ss[1].year
times s1, s2, s3;
s1.year = 2001;
s2.year = 2015;
cout << "s1.year = " << s1.year << endl;
cout << "s2.year = " << s2.year << endl;
times *ppd[3] = {&s1, &s2, &s3}; //指针数组,每一位存一个指针
(ppd[1])->year = 2002;
cout << "s2.year = " << s2.year << endl;
//数组的指针,ppd是一个数组的名称,因此ppd是数组第一个元素的地址
//第一个元素又是指针,那么ppa是一个指针,指向time的指针。
const times **ppa = ppd;
auto arp = ppd; //C++11的写法更简洁
//*ppa 是一个结构指针,ppa指向ppd第一个元素,因此*ppa是第一个元素,即&s1
//(*ppa)->year 是s1的成员year ,括号不能少,因为 ppa->year不是指针 不能*(ppa->year)
cout << "ppa = " << (*ppa)->year << endl;
cout << "arp = " << (*(arp+1))->year << endl;
return 0;
}
23.vector 堆分配空间,灵活但效率低。array 栈分配空间,固定长度,相比数组安全高效。
vector<int> a;
array<int, 10> a;
24.数组和指针关系紧密,如果ar是数组名, ar[1] 等效 *(ar+1)