c++ primer plus 第四章复合类型

4、1数组

数组能够存储多个同类型的值,计算机在内存中一次存储数组的各个元素。

数组的声明

1、存储值的类型

2、数组名

3、数组中的个数

int moths[12];

创建了一个名为moths的数组,该数组有12个元素,每个元素存储一个int类型的值

使用下标或者索引来对元素进行访问

从0开始。

编译器并不会检查下标是否有效。

数组初始化:

int a[4] = {0,1,2,3};

int b[4];

4、2字符串

字符串是存储在内存中的连续字节中的一系列字符。

char cat[3] = {‘c’,‘a’,‘t’,'\0'};

char数组的字符串必须有空字符(\0)

打印的时候遇到空字符停止

另一种将字符数组转化为字符串的方法,只需要使用一个引号括起来的字符串

char cat[3] = "cat";

char cat[]="cat";

用引号括起来的字符串结尾隐式的的包含空字符

c语言库函数strlen(来确定字符串长度)

用sizeof来判断多少字节

4、3程序

#include 

int main(void)
{
    using namespace std;

    const int ArSize = 20;

    char name[ArSize];
    char dessert[ArSize];

    cout << "Enter your name: " << endl;
    cin >> name;
    cout << "Enter your favorite dessert: " << endl;
    cin >> dessert;

    cout << "I have some delicious " << dessert << " for you, " << name << ". " << endl;

    return 0;
}
Enter your name:
zhang san
Enter your favorite dessert:
I have some delicious san for you, zhang.

会发现我们还没有输入甜点的程序就把他显示出来了。然后立即显示最后一行。

cin是如何确定已完成字符串的输入呢?

由于不能通过键盘输入空字符,因此cin使用(空格、制表符和换行符)来确定字符串的结束为止。

这意味着cin在获取字符输入输入时只读取一个单词。读取该单词后cin将在该字符串放到数组中,并自动在结尾天界空字符。

这个例子就是,cin把zhagn作为第一个字符,放到name数组中,把san留在输入队列中,当cin再输入队列搜索用户喜欢的甜点的时,他发现了san,因此cin读取三放入了dessert数组中。

4、2、4每次读取一行字符

isteam中的类提供了一些面向行的类成员函数:

geilin() 和  get()

这个两个函数都读取一行的输入知道到达换行符。

getline()将丢弃换行符

get()将换行符保留在队列中

1、getline()

用cin.getline()来调用

该函数有两个参数

一个是数组名

一个是字符数,默认输入字符数-1,因为要留一个给空字符

读取到指定数目或者遇见换行符停止读取。

假设:

使用getline()将姓名读入一个包含20个元素的name数组中

cin.getline(name,20)

实际读取19个,有一个留给空字符

2、get()

不丢弃换行符

当我连续两次调用get()的时候,会发现第二次调用看到的是换行符,因为第一次调用默认把换行符留在了队列中。

可以这样更改

cin.get(name,10)

cin.get()

cin.get(dessert,10)

4、4string类简介

用string类型的变量

而不是字符数组来存储字符串

要使用string类型必须头文件包含头文件string

string对象声明为简单的变量而不是数组

string str;

string str2 = “hahah”;

string可以用+把两个字符串连接起来。

string str1;

string str2;

string str3  = str1 + str2

使用strcpy(a,b)将字符串复制到数组中   复制b到a

使用strcat(a,b)将字符串加到字符末尾   把b添加到a末尾

确定字符串中字符数的方法:

int len1 = str1.size();

int len2 = strlen(charr;

4、4结构简介

结构可以存储多种类型的数据

strut a 

{

char name[20];

float volume;

double price;

}

a是结构体的名

a结构有个三个成员

创建结构体变量

a hat;

a hah;

a  hello;

由于hat的类型是a,所以可以使用成员运算符来访问各个成员。hat.volume指的是结构的volume成员

初始化:

a haha=

{

"glorious",

1.99,

29.99

};

用逗号隔开

4、5共用体:

是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。

结构可以同时存储int ,float

共用体只能存储int或float或double;

union a

{

int haha;

long long_hah;

double double_val;

};

a pail;

pail.haha = 15;

pail.double_val = 1.38;

共用体每次只能存储一个值。

4、6枚举

enum提供了另一种创建符号常量的方式。可以代替const

enum a {red,orange,yellow,green};

a成为新类型的名称

a被称为枚举

将red等作为符号常量他们对应的值是0-7,这些常量叫做枚举量

默认将整数值赋给枚举量,第一个是0第二个是1。

设置枚举量

enum bits {one = 1,two = 2,four = 4,eight = 8};

值必须为整数

enum B {a , b = 100 ,d}

其中a=0, d = 101

4、7指针和自由存储空间

指针是一个变量,存储的是地址

取值运算符&

取值运算符*

home是一个变量,则&home就是他的地址

oop强调的是运行阶段进行决策

指针声明

指针声明必须指定指针指向的数据的类型

int *p;

*p的类型是int

p指向int类型

p的类型是指向int的指针

p是指针

*p是int

指针的危险:

c++中创建指针的时候,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。

int *p;

*p = 224;

是不对的。

指针描述的是位置

要将数组织作为地址来使用要强制类型转换:

int *p;

p  = (int *) 0xb80000;

用new来分配内存

int *p = new int;

new找到一个长度正确的内存块,并返回内存块的地址。

在运行阶段为一个int值分配未命名的内存,并使用指针来访问这个值。

new int 告诉程度,找一个适合存储int的内存。

使用delete来释放内存

当使用完内存后用delete来释放他。

int *p = new int;

...

delete p;

释放内存但并不删除p本身。

使用new来创建动态数组

假设编写一个程序,他是否需要数组取决于运行时用户提供的信息。

使用new就可以在运行阶段创建一个数组。程序将在运行时确定数组的长度。

int *p = new int[10];

创建包含10个int类型的数组。

释放:

delete [] p;

p指向了10个int值内存块的第一个元素

假设int占4个字节

往后移动四个字节就是指向第2个元素

*p就是第一个元素的值。

p +1是第二元素的地址

4、8指针、数组和指针算数

将指针变量+1,增加的量等于它指向的类型的字节数。

int wage[3] = {1,2,3};

int * p = wage;

wage = &wage[0];

使用new创建动态结构:

inflatable *p = new Inflatable;

把足以储存inflatable结构的一块可用内存的地址赋值为p。

创建动态结构时,不用使用成员运算符访问。

要用->访问

4、10数组的替代品

vector和array是数组的替代品

1、模板类vector

模板类vector类似于string类。是一种动态数组

可以再运行阶段设置cector对象的长度。可在末尾附加数据,还可以在中间插入数据。

使用vector对象必须包含头文件vector

#include
...
using namespace std;

vector vi;
int n;
cin >> n ;
vector vd(n);

vi是一个vector对象

vd是一个vector对象

vi的初始长度是0

vn的初始初始长度是n

模板类array

vector类功能比数组强大,但效率低。如果需要固定长度的数组,使用数组是更加的选择、

array长度是固定的

arry对象的创建

#include
...
using namespace;
array ai;
array ad = {1.1,2.2,3.3,4.4};

4、12复习题:

c++ primer plus 第四章复合类型_第1张图片

1、 a:
char actor[30];
b:
short betsie[100];
c:
float chuck[13];
d:
long double dipsea[64];

2、

array actor;
array betsie;
array chuck;
array dipsea;

3、int array[5] = {1,3,5,7,9};

4、int even = array[0] + array[5];

5.cout << ideas[1]<

6.char ch[12]= "cheeseburger";

7.string str="waldorf salad";

8.strut fish

{

char name[20];

int weight;

float length;

}

9.fish a ={"yuu",10,2.2};

10.enum response {no ,yes,maybe};

11.double ted = 10;

int *p = &ted;

12.float treacle[10];

float *p = treacle;

13.

int num ;

cin >> num;

int *p = new int[num];

vector pt(num);

14.valiable,print string's address. won't print string "Home of jolly bytes"

15.

struct fish
{
    char kind[30];
    int weight;
    float length;
};

fish *pt = new fish;

16.cin >> address; >> read from input until it comes a blank

17.

#include
#include
#include

const int size = 10;
std::vector arr(size);
std::array array;

4.13编程练习

 

你可能感兴趣的:(C++,primer,plus,c++,leetcode,排序算法)