C++学习笔记4 - 符合类型

来源:互联网 发布:数控车图纸编程 编辑:程序博客网 时间:2024/06/05 02:14

《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};  //初始化   如果只有{}  初始化为0

  sname2 = 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].yeartimes 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)


0 0
原创粉丝点击