数组定义中的类型名可以是内置数据类型或者类类型;除了引用之外,数组元素的类型还可以是任意的复合类型。另外,非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。
#include <iostream> #include <string> #include <cstring> #include <bitset> using namespace std; int main() { const int MAXN1 = 5; int MAXN2 = 6; const int MAXN3 = get_size(); int num1[MAXN1]; // ok int num2[MAXN2]; // error,non const variable int num3[MAXN3]; // error size not known until run time return 0; }
虽然MAXN2使用字面值常量初始化的,但是他是一个非const对象,只有在运行的时候才能够获得他的值,因此定义维数是非法的。同理MAXN3的值也要等到运行时才能够得出get_size()。
2.数组的初始化
当我们没有显式提供数组的初值时,是怎样的初始化规则呢?
-- 在函数体外定义的内置数组,其元素均初始化为0。
-- 在函数体内定义的内置数组,其元素无初始化。
-- 不管数组在哪里定义,如果其元素类型为类类型,则自动调用该类的默认构造函数进行初始化;如果该类没有默认构造函数,则必须为该数组提供显示初始化。
#include <iostream> #include <string> #include <cstring> #include <bitset> using namespace std; int a[5]; int main() { int b[5]; for (int i = 0; i < 5; i++) cout << a[i] << " "; cout << endl; for (int i = 0; i < 5; i++) cout << b[i] << " "; cout << endl; return 0; }
所以在函数内部定义的数组一定要初始化,否则这些操作没有意义。
3.赋值和复制
与vector不同,一个数组不能用另一个数组初始化,也不能将一个数组赋值给另一个数组,这些操作是非法的。
#include <iostream> #include <string> #include <cstring> #include <bitset> using namespace std; int a[5]; int main() { int b[5]; b = a; //error return 0; }(一)动态数组:
#include <iostream> #include <string> #include <cstring> #include <bitset> #include <algorithm> using namespace std; int main() { int *p1 = new int[10]; //未初始化 int *p2 = new int[10](); //初始化为0 int num = 5; int *p3 = new int[num]; const int *p4 = new const int[100]; //error,必须初始化 const int *p5 = new const int[100](); //ok size_t n = get_size(); int *p = new int[n]; //ok,but if n=0,then & is unable to use delete[] p; return 0; }(二)混合使用string和c风格字符串
string s = "fdsafd"; //char *p = s; // error const char *p = s.c_str(); //ok, return const/ 注意,如果之后s发生改变,那么*(p+n)取出的是变化后的值
#include <iostream> #include <string> #include <cstring> #include <bitset> #include <algorithm> using namespace std; int main() { int ia[3][4]; int(*ip)[4] = ia; // ip points to an array of 4 ints //int *ip[4]; // array of points to int //ip = &ia[2]; for (ip = ia; ip != ia + 3;ip++) for (int *q = *ip; q != *ip + 4; ++q) cout << *q << endl; return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
C++ Primer 学习笔记与思考_5 数组和动态数组易错点解读
原文地址:http://blog.csdn.net/nk_test/article/details/47701647