Primer (六)

来源:互联网 发布:网络拓扑结构图片 编辑:程序博客网 时间:2024/05/20 06:25

数组

1. 数组也是容器,和vector的区别在于不能动态增长,必须初始化时指定长度,可以存放任何对象。

2. 引用不是对象,所以没有存放引用的数组。

3. 初始化数组长度必须使用常量:

int a = 10;const int b = 10;int c[a]; // 错误,a不是常量int c[b]; // 正确
4. 用字符串初始化数组时,最后一位默认为空字符。

char s[] = "abcde"; // 自动添加最后的空字符char s[5] = "abcde"; // 错误,最后空字符没有地方char s[] = {'a','b','c'}; // 正确,不是字符串,没有最后的空字符
5. 复杂的数组定义

int *p[10]; // 定义10个指针的数组int (*p)[10] = &arr; // 定义一个指针,指向一个10个int元素的数组arrint (&r)[10] = arr; // 定义一个引用,引用一个10个int元素的数组arrint *(&r)[10] = arr; // 定义一个引用,引用一个数组arr,arr包含10个int指针 
判断复杂数组,需要从内向外,从右向左。

6. 数组与vector、string一样,都可以使用范围for和下标两种方式遍历。

7. 数组没有迭代器,指针相当于迭代器,每个数组名就是指向第一个元素的指针,可以移动,作为迭代器使用。

int a[10];int *e = &a[10]; // e指向a的最后一个元素的下一个for (int *b = a; b != e; ++b) {    cout<<*b; // e不可以解引用}int *b = begin(a); // 返回数组头指针int *e = end(a); // 返回数组尾指针,最后一个元素的下一个int *p = a + 10; // p不可以解引用int *p = a + 20; // 错误,越界auto n = end(a) - begin(a); // 得到数组长度,类型为ptrdiff_ta[3] = {1,2,3};int *p = &a[2]; // p指向&a[3]int *q = p[-1]; // 所有指向数组元素的指针,都可以直接当做数组用,这里的下标是可以为负数的
8. 赋值

int a[5];int b[5] = a; // 错误,不允许数组初始化数组b = a; // 错误,不允许数组赋值数组vector<int> v(begin(a), end(a)); // 但是,可以用数组赋值vector,传入两个指针即可

9. c_str()

string s = "abc";char *p = s; // 错误,s是string不能赋值指针char *p = s.c_str(); //正确,c_str()将一个string转化成以空字符结尾的char数组,并且返回指向头元素的指针,这样p就指向了char数组的头元素char c = {'a', 'b', '\0'};string s = c; // 正确,char数组可以赋值string
c_str()返回一个const char* 临时创建一个string转化的char数组,并指向这个临时数组。
string s = "abc";
const char *p = s.c_str(); // string转化成char[],必须先转化成const char*
cout<<*p<<p<<endl; // a   abc   *p是首元素,p是整个字符串
char c[] = "abcde";char *p = c + 1; // p指向b *p='b'string s = p + 1; // s是从c开始到数组结束的字符串cout<<*p<<endl; // bcout<<s<<endl; // cde

10. 尽量使用vector和迭代器,代替数组和指针。尽量使用string代替数组表示的旧式字符串。




原创粉丝点击