数组能够存储多个同类型的值,计算机在内存中一次存储数组的各个元素。
数组的声明
1、存储值的类型
2、数组名
3、数组中的个数
int moths[12];
创建了一个名为moths的数组,该数组有12个元素,每个元素存储一个int类型的值
使用下标或者索引来对元素进行访问
从0开始。
编译器并不会检查下标是否有效。
数组初始化:
int a[4] = {0,1,2,3};
int b[4];
字符串是存储在内存中的连续字节中的一系列字符。
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)
用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;
结构可以存储多种类型的数据
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
指针是一个变量,存储的是地址
取值运算符&
取值运算符*
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。
创建动态结构时,不用使用成员运算符访问。
要用->访问
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复习题:
1、 a:
char actor[30];
b:
short betsie[100];
c:
float chuck[13];
d:
long double dipsea[64];
2、
array
array
array
array
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 14.valiable,print string's address. won't print string "Home of jolly bytes" 15. struct fish fish *pt = new fish; 16.cin >> address; >> read from input until it comes a blank 17. #include const int size = 10;
{
char kind[30];
int weight;
float length;
};
#include
#include
std::vector
std::array4.13编程练习