1、数组类似于标准库类型vector容器,都是存放相同对象的容器,但是数组存放的对象本身没有名字,并且灵活性也不如vector容器。
2、数组的维度必须是一个常量表达式。
3、与内置类型变量一样,数组若定义在函数体内部没有给它初始化,则其行为是未定义的。默认情况下,数组会被默认初始化。
4、没有引用数组,也不能使用auto去让编译器自己推导数组的类型,必须指定好数组的类型。
5、若使用列表初始化的方式初始化数组,可以省略数组的维度,编译器可以根据数组的初始化列表中元素的数目来推断出来维度的大小。
6、使用字符串字面值来初始化字符数组时,要注意字符串字面值的末尾还有一个空字符,在进行拷贝初始化时也会被拷贝到字符数组里的,一样要占用数组的大小。而string类的对象则不会,拷贝初始化的过程中不会将结尾的空字符也拷贝进去。
7、不能将一个数组拿来初始化或者赋值到另一个数组。一些编译器可能支持这种操作,就是所谓的编译器扩展,支持非标准特性。
8、指针数组:强调的是数组。 int *pi[10]; 表示一个包含了10个指向int类型的指针的数组; 数组指针:强调的是指针。 int (*pi)[10]=&i; 表示pi是指向一个含有10个Int类型整数的数组的指针。
没有引用数组,但是有数组引用。同样,强调的是引用。 int (&r)[10]=i; 表示r是引用了一个含有10个Int类型整数的数组。
《C++ Primer fifth》里面说到想要理解数组的含义,最好的办法是从数组名字开始按照由内向外的顺序阅读。
9、数组下标索引值的类型size_t与size_type类型一样都是无符号整型数,size_t定义在cstddef头文件中,数组的下标运算符是由C++语言直接定义的,而vector与string类的对象的下标运算符,是其自身类内定义的成员函数,仅用于他们类的对象。
10、数组下标不要出现越界行为,否则会出现缓冲区溢出,当数组的下标越界并且访问一个非法的内存区域时,会产生缓冲区溢出。
11、通常情况下,取地址符可以用于任何对象,包括数组。可以通过数组下标取得某一个元素,然后通过取地址符,返回一个指向该位置元素的指针。
12、很多情况下,当使用数组名时,编译器会自动的将其转换成一个指向数组首元素的指针。在一些时候,对数组的操作,实际上是对指针的操作。
13、当使用auto去判断由数组初始化的变量的类型,编译器推断出来的是一个指针。但是若使用decltype来推断类型,则不是这样的,decltype返回的类型是参数的类型,如果参数是一个大小为5的int类型的数组,那么其推断出来的是一个大小为10
的int类型的数组。
14、C++11标准下,提供了两个函数begin()和end(),两者的参数都是数组,begin()函数是返回指向数组首元素的指针,end函数是返回指向数组尾元素的下一个位置。
15、不能对指向数组尾元素的下一个位置的指针进行解引用和递增操作。
16、若指针指向一个数组,则给指针加上一个整数值,就表示指针移动到整数值大小之后的位置,其结果得到后的指针必须是指向同一个数组的元素或者尾元素的下一个位置。
17、若指针加上一个数组大小的整数,那么编译器就会把指针初始指向的元素转换成数组首元素,不能让指针加上一个比数组容量还大的整数,否则指针会未定义。
18、指针相减得到的类型是ptrdiff_t,与迭代器相减的结果类型difference_t一样是带符号的整数,表示两个指针的距离。
19、定义的指针若想比较,必须有关系,如在同一个数组中两个指针比较大小,若两个指针指向的是无关的两个对象,则比较没有意义。
20、由于数组使用的是C++内置的下标运算符,所以不是一个无符号整数,而vector与string标准库类型的下标运算符的索引值就是无符号整数。
21、数组有两个重要的性质:1)数组不允许拷贝 2)使用数组时通常会转换成对指针的操作。