primer C++笔记
数组
定义和初始化内置数组
不允许拷贝和赋值
理解复杂的数组声明
默认情况下,类型修饰符从右向左依次绑定,对于ptrs理解比较简单:首先我们知道定义的是一个大小为10的数组,它的名字是ptrs,然后知道数组中存放的是指向int的指针。
但是对于Parray来说,从右向左就不太合理了。因为数组的维度是紧跟着被声明的名字的,所以就数组而言,由内向外阅读就比从右向左好多了,*Parray意味着Parray是个指针,Parray是一个指针,它指向一个int数组,数组包含10个元素。
int *(&arry)[10] = ptrs; //arry是数组的引用,该数组含有10个指针
3.5.1节练习
//const int txt_size() { return 1; }
//常量表达式:能在编译时计算并获取结果的表达式
constexpr int txt_size() { return 1; }
void test01()
{
unsigned buf_size = 1024;
int ia[buf_size]; //常量值才可以
int ia[4 * 7 - 14];
int ia[txt_size()];
char a[11] = "fundamental"; //末尾“\0”
}
string sa[10];
int ia[10];
void test02()
{
string sa2[10];
int ia2[10];
cout << sa[9] << endl; //""
cout << ia[9] << endl; //0
cout << sa2[9] << endl; //""
cout << ia2[9] << endl; //开辟的连续内存,无意义值
}
访问数组元素
指针和数组
在很多用到数组名字的地方,编译器都会自动地将其替换为一个指向数组首元素的指针。
指针也是迭代器
标准库函数begin和end
constexpr size_t sz = 5;
int arr[sz] = {1,2,3,4,5};
int *p = arr + sz; //指向尾元素的下一位置,不要解引用
int *p2 = arr + 10; //p2无效,编译不会报错
解引用和指针运算的交互
int ia[] = {0,2,4,6,8};
int last = *(ia + 4); //*(ia + 4) 等价于 ia[4]
last = *ia + 4 //等价于ia[0] + 4
标准库类型限定使用的下表必须是无符号类型,而内置的下标运算无此要求
C风格字符串
混用string对象和C风格字符创
使用数组来初始化vector对象