您的位置:首页 > 编程语言 > C语言/C++

《C++ Primer Plus》Ch04笔记

2017-09-30 14:09 141 查看

数组

不能将一个数组赋值给另一个数组。

部分初始化数组,编译器将其他元素设置为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"
是错误的。

结构

//定义结构inflatable
struct 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修饰ps
cout << 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++11
g++ -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方法定义的变量,存储在或自由储存空间中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: