C++Primer学习笔记12.9

67 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

3.5 数组

不同于vector:数组大小确定不变,不能随意向数组中增加元素。对于不确定元素的确切个数,建议使用vector

3.5.1 定义和初始化内置数组

编译的时候,数组的维度应该是已知的,所以,维度必须是一个常量表达式

字符数组的特殊性

//在使用字符串字面值初始化时,要注意字符串字面值结尾还有一个空字符
const char a4[6] = "abcdef"; //err没有空间添加空字符,检索过程只用碰到空字符才会停止,如此的话会持续检索下去导致出现不可预料的安全问题
char ca[] = {'c', '+', '+'};
cout << strlen(ca) << endl; //严重错误,没有空字符,strlen可能会沿着ca的内存中的位置不断寻找直到遇到空字符

不允许拷贝和赋值如果在某些编译器上允许,那是得益于所谓的编译器扩展,但是在移植到其它编译器上可能会出现问题。所以,不要使用非标准特性

复杂的数组声明

int *ptrs[10];  //ptrs是含有10个整形指针的数组
int &refs[10] = /* ? */;  //err不存在引用的数组
int (*Parray)[10] = &arr;  //Parray指向一个含有10个整数的数组
int (*arrRef)[10] = arr;   //arrRef引用一个含有10个整数的数组
                           //arry指向一个含有10个整数的数组的引用
int *(&arry)[10] = ptrs;   //arry是数组的引用,该数组含有10个指针

3.5.3 指针和数组

C++11特性引入两个函数begin和end。

int ia[] = {1,2,3,4,5};
int *b = begin(ia); //这是是将数组作为两个函数的参数使用
int *e = end(ia);   //

3.5.4 C风格字符串

strlen(p)返回p的长度
strcmp(p1, p2)比较。p1==p2,返回0;p1>p2,返回正值;p1<p2,返回负值;
strcat(p1, p2)p2附加到p1后,返回p1
strcpy(p1, p2)将p2拷贝给p1,返回p1