第四章 数组和指针
1. 数组的初始化,如a[x],这个x可以有三种表示方法:
[1] 整形字面值常量,int x=27;之所以叫字面值是因为只能从字面上来看,常量是不能修改。可用十进制、八进制和十六进制。int long
[2] 枚举常量:enum a(x1,x2,x3):枚举成员是常量,默认的后边的值比前一个大1.
[3] 用常量表达式初始化的整型const对象。如const b=3;char a[b];
2. 函数体外定义的内置数组,元素初始化为0;体内定义,则无初始化。
3. 数组初始化 char a=”ab”;chara={‘a’,’b’,’/0’};是等价的。“ab”其实是三个字符。
4. 数组和vector的区别:数组长度固定,没有获取容量的size操作,不能自动添加元素的push_back操作。不能直接复制
5. 数组下标:size_,const size_t a=10;
vector下标vector::size_type,都是从0开始计数。
6. 数组里边的字符要按空格或者换行来输入呀傻瓜。
7. 指针用于指向单个对象,而迭代器只能用于访问容器内的元素。
8. 每个指针都有个与之对应的数据类型,string*p1,p2;只有p1是指针。
9. 避免使用未初始化的指针,很多错误都源于此。
10. int x=30;px=&x;这是赋值
*px=&x;这个是取地址
11. C++中无法检测一个指针是否未被初始化,页无法检测地址是否有效。
12. int*p=&x;相当于两句话:int*p;p=&x;
13. 指针和引用:
相同点:都可以间接访问另一个值。
区别:引用需要初始化,一经初始化指向一个特定的值。指针可指向不同的对象。
14. const对象的地址也只能付给一个const对象的指针,即指向const对象的指针也须有const特性。
15. 只能用const void*类型的指针保存const对象。
16. 指向const对象的指针和const指针,前者所指向的值不能改变,后者指针的值不能改变。
string s;
typedef string *pstring;
const pstring cs1=&s;
pstring const cs2=&s;
string *const cs3=&s;
这三个都是常量const指针。第一个容易搞混,一般写第二个哟。
17. cons tint cp;cp=xp1;这个赋值是错误的,因为cp是const变量,即常量,不能被赋值。
18. C风格字符串,需包含头文件#include<cstring>.
[1] strlen(s);返回s的长度,不包括字符串结束符Null
[2] strcmp(s1,s2)比较两个字符串是否相等,=.0;>,1;<,负数。
[3] strcat(s1,s2)s2连接到s1后边,返回s1
[4] strcpy(s1,s2)将s2复制给s1,返回s1
[5] strncat(s1,s2,n)将s2的前n个字符连接到s1后边,返回s1
[6] strncpy(s1,s2,n)将s2的前n个字符复制给s1,返回s1
19. char表示单个字符,但是chara[100]是个字符数组啦,所以没事~~
20. 使用C语言字符串时容易溢出,而使用C++字符串string时不用管,标准库负责所有的内存管理问题。
21. 数组类型变量的限制:长度固定不变,编译时需要知道其长度,数组只在定义它的块语句内存在。
22. 每个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象。此内存空间称为程序的自由存储区或堆。
动态数组
23. 动态数组只需指定类型和长度,无须说明数组名,通过其间接地址访问堆中的对象。如:
new int[10];
24. 动态内存的初始化,若数组元素具有类类型,则使用默认构造函数进行初始化,如果是内置类型,则无初始化。
25. const对象动态数组无法直接赋值,只好对数组进行值初始化咯。const int*pci=new cons tint[100]();
26. 允许动态分配空数组,
27. size_t n=get_size();
int *p=newint[n];
28. 释放动态空间,delete[] pia;回收pia所指向的数组。
29. 编写程序用int型数组初始化vector对象vector<int>ivec(in_arr,in_arr+arr_size);