《C++ Primer Plus》Ch04笔记

来源:互联网 发布:微信群淘宝优惠券提成 编辑:程序博客网 时间:2024/06/14 00:15

数组

  • 不能将一个数组赋值给另一个数组。
  • 部分初始化数组,编译器将其他元素设置为0。
  • 初始化数组的”[]”为空,可以让编译器计算数组大小。
  • 初始化数组可以省略”=“;可使用空的”{}“,此时所有元素为0.

字符串

  • 初始化:char cat[2]={'a','\0'}必须包含空字符’\0’,其ASCII为0。
  • char cat[2]={'a','b'}不是字符串,用cout打印时,会将其内存地址随后的内存中,储存的各个字节解释为字符打印出来,直到遇到’\0’。
  • ‘S’是字符常量,赋值操作char a='S',”S”是字符串,是字符’S’,’\0’的组合,char a="S"是错误的。

结构

//定义结构inflatablestruct inflatable{    char name[20];    float volumn;};inflatable hat = {"binggo", 50.1};    //创建inflatable结构的变量hat//与数组不同,hat[0]没有意义。cout << hat.name;    //访问结构成员
  • 初始化结构时,可以省略“=”,inflatable hat;此时未提供数据,则全部初化为0.
  • 将结构定义和变量声明放在一起,
struct inflatable    //结构名称可以省略,但此后不能再声明该结构变量了{    char name[20];    float volumn;} bing;    //此时bing内数据成员全部为0
  • 结构数组:inflatable arr[2] = {{"Wu",2.0},{"Bi",3.0}};

共用体

union id{    long id_num;    char id_char[20];};  
  • 共用体每次只能储存一个变量,其大小为最大成员的大小。

枚举

enum spectrum {red, orange, yellow};spectrum band;band = red;
  • 在默认的情况下,第一个枚举量为0,第二个为1,…。
  • 枚举只定义了复制运算符。
  • 枚举的值只能是整数,即int,long,long long类型。
  • 每个枚举都有取值范围,可以将取值范围内任何整数值赋值给枚举变量。

指针

  • 数据的3种属性:1.地址;2.值;3.类型。声明语句指出了变量名、值的类型,还让程序给值分配了内存。
  • 和数组一样,指针都是基于其他类型的。如char的地址和double的地址差不多(栈区),占8字节,但char和double使用的字节数不同,储存值时使用的格式也不一样,所以声明指针时需要有类型。
  • C++创建指针时,计算机将分配用来储存地址的内存,但不会分配指针所指向的数据内存。
  • 一定要在解引用指针前,将指针初始化一个确定的地址。如int* a;*a=1;是很危险的。
  • 计算机通常把地址当做16进制整数处理,但指针不是整型。
int* p;p = 0xB8000000;    //C语言允许,但C++不允许p = (int*)0xB8000000;    //转换类型后才能赋值
  • 将指针变量加1,其增加的值等于指向类型占用的字节数。
  • 对数组名取地址,得到的是整个数组的地址,其单位长度为整个数组的长度。
const char* ps = "binggo";    //"binggo"是字符常量,需要用cosnt修饰pscout << ps << ", " << (int*)ps << endl;    //Note:读取字符常量地址时需要强制类型转化。

类型组合

// person为结构person m1,m2,m3;person* arr[3] = {&m1,&m2,&m3};    //指针数组person** p = arr;//p为指针,它指向的对象还是指针cout << *(p+1);    //==arr[1]=&m2

vector/array

#include <vector>#include <array>using namespace std;//使用g++编译时,添加编译选项-std=c++11g++ -std=c++11 choices.cpp && ./a.out
  • vector类使用new和delete来个管理内存的,故vector对象储存在堆中。
  • 定义vector<typeName> vt(n);,n可以是变量。初始化只能一个一个来vt[0]=1.2;,不能像数组那样。
  • array定义array<typeName,n> arr;,n只能是常量。初始化类似数组。可以直接赋值arr1=arr2.
  • arr2.at(1)=1.1;,成员函数at(),用于捕获非法索引。

储存类型

自动储存
在函数内部定义的常规变量被称为自动变量,是一个局部变量,其作用域为包含它的代码块,代码块是被包含在花括号中的一段代码。自动变量储存在栈中,执行代码块时,变量依次加入到中,各个变量的内存地址连续,离开代码块时按相反顺序释放这些变量。
静态储存
在整个程序执行期间都存在的变量称为自动变量,定义静态变量两种方式:1.在函数外部定义;2.关键字static。静态储存变量储存在数据段
动态储存
使用new和delete方法定义的变量,存储在或自由储存空间中。

原创粉丝点击