一维数组用于函数的参数
在C++内部,用指针来处理数组。
C++编译器把 数组名[下标] 解释为 *(数组首地址+下标),
C++编译器把 地址[下标] 解释为 *(地址+下标)。
- 函数参数列表中指针和数组的区别
在函数的参数列表中,二者只是写法有差别,实质使用上等同于指针。故在函数参数列表中传数组时,应该加上数组长度。
用new创建一维数组
栈上的内存很小,存储大容量数据应该在堆上使用内存。
- 动态创建的数组没有数组名,不能用sizeof运算符
1 2 3 4 5 6 |
// 在栈上创建长度为1百万字节的数组,VS运行程序出现异常。 char arr[1000000]; // 在堆上上创建长度为十亿字节的数组,VS正常。 char *arr1 = new char[100000000] // 一百亿后崩溃 |
安全创建大容量数组的方法
1 2 3 4 |
int *a = new (std::nothrow) int [10000000000]; if (a == nullptr) { cout << "内存分配失败" << endl; } else { cout << "内存分配成功" << endl; } |
二维数组
在C++中,数组的长度必须是整数,可以是常量,也可以是表达式。
整型常量表达式
整型常量表达式指的是表达式中的操作数都是整数类型的, 这里的整数类型不仅仅是int类型, 还包括char, (unsigned) short, (unsigned) long等类型. 整型常量表达式中的操作数在编译时就已经确定了他的值, 因此只需要关注哪些值在编译时确定就可以了. 这包括以下几种情况:
- 单个字符, 比如’A’, ‘a’
- 单个整数数字以及由整数数字构成的表达式, 如123, 123 + 345
- 枚举常量
- 有sizeof 运算法返回的值, 如sizeof(int)
- NULL指针值
- 地址常量. 如0X12345678, 以及地址常量加上一个偏移
在C90和C++中, 静态数组定义时, 需要提供整形常量表达式. 如int A[10];因此, 你可以简单的试试用一个表达式去定义一个数组, 如果数组可以正常定义, 这表明这是一个整形表达式.
C90规定必须用常量表达式指明数组的大小,C99允许使用整型非常量表达式。经测试,在VS中可以用用整型非常量表达式,不能用变量;但是,Linux中还可以用变量。
另外, 在C中, const关键字并不是代表其所修饰的变量是常量. 他仅仅代表const 修饰的变量是read-only的, 无法对他进行修改. 这点与C++不同, C++中const关键字可以定义一个整形常量, 因此
1 2 3 |
const int size = 10; int array[size]; /* C语言中, 编译不通过, C++中可以通过 */ |
参考资料:
注意:
据上,因为在C/C++中,用枚举类型中的元素来代表常量,故枚举元素不能为字符常量或者整形常量。
二维数组用于函数的参数
数组指针即行指针。
一维数组名被解释为数组第0个元素的地址。
对一维数组名取地址得到的是数组的地址,是行地址。
即用一个组的第一个同学标定一个组的位置,该组也就有了位置。对数组名取地址得到的是该组第一个同学的位置,这也是这个组的位置标识。区别在于标定别的位置:
若是先确定该组的位置再找下一个(对数组名取地址+1),找到的是排在本组的第一个同学之后的第二个同学的位置。若是直接找下一个组的位置(数组名+1),找到的是排在本组后的下一个组的第一个同学的位置。指针和数组(指针)的区别即在于此。
个人和团体,指针和数组,行为(函数)和内容(变量),整形和非整形。
留言