c++数组定义及初始化
C ++提供了⼀种数据结构,即数组,该数组存储⼀个固定⼤⼩的由相同类型元素构成的顺序集合。数组中的元素存储在⼀个连续内存位置中,元素可通过数组索引访问, 最低地址对应于第⼀个元素,最⾼地址对应于最后⼀个元素。
声明数组
例如
声明固定长度的数组:
const int Size = 5;
int arr[Size] = {3, 6, 9, 12, 15};
arr[3] = 42;
注意:⽅括号[]中的内容(表⽰数组中元素的数量)必须是⼀个常量表达式,因为数组是静态内存块,必须在编译时确定⼤⼩,然后程序才能运⾏。
初始化数组
int arr[] = { 10, 20, 30, 40 }
声明固定长度的数组同时初始化
const int Size = 5;
int arr[Size] = { 10, 20, 30, 40 }
上述声明⽅式⽤来定义⼀个静态数组,静态数组所需内存⼤⼩要在编译时就确定下来,数组被分配在栈上. 但是在某些情况下,只能在运⾏时确定程序的内存需求。例如,何时需要存储空间取决于⽤户输⼊。在这些情况下,程序需要动态分配内存,为此C ++语⾔将操作符new和delete集成在⼀起。
动态数组
使⽤操作符new分配动态内存。 new之后是数据类型说明符,如果需要⼀个以上的元素序列,则在括号[]中包含这些元素的数量。它返回⼀个指向分配的新内存块开头的指针。其语法为:
pointer = new type
pointer = new type [number_of_elements]
举例:
int * foo;
foo = new int [5];
在这种情况下,系统会为int类型的五个元素动态分配空间,并返回⼀个指向序列第⼀个元素的指针,该指针被分配给foo(⼀个指针)。因此,foo现在指向⼀个有五个int类型的元素的有效内存块。
在这⾥,foo是⼀个指针,因此,可以使⽤表达式foo [0]或表达式* foo(两者都是等效的)访问foo指向的第⼀个元素。可以使⽤foo [1]或
*(foo + 1)来访问第⼆个元素,依此类推...
静态数组和动态数组最重要的区别是,静态数组的⼤⼩必须是⼀个常量表达式,因此必须在设计程序时确定其⼤⼩,然后再运⾏它,⽽由new执⾏的动态内存分配则可以在运⾏时使⽤任何变量值作为⼤⼩分配内存。因为foo是指向动态数据的指针,因此可以删除此数据,并可以将新数据分配给该指针。
int* foo = new int[5]; // arr now points to a dynamic array of size 5
delete[] foo;
foo = new int[10]; // arr now points to a dynamic array of size 10
delete[] foo;
foo = new int(5); // arr now points to a single int, of value 5.
delete foo;
⽣成⼀个⼆维动态数组
int** a = new int*[rowCount];
for(int i = 0; i < rowCount; ++i)
a[i] = new int[colCount];
总结:
静态数组和动态数组的区别
定义数组初始化
1、静态数组的⼤⼩是在编译期间就确定,并且分配的,其内存在使⽤结束后由计算机⾃动释放,效率⾼;动态数组是在程序运⾏时,由程序员根据实际需要从堆内存中动态申请的,使⽤结束后由程序员进⾏释放,效率低。
2、对静态数组进⾏sizeof运算时,结果是整个数组的⼤⼩,⽽对动态数组进⾏sizeof运算时,因为地址位数为4字节,所以结果为常数4.
3、从寻址的⾓度来说,静态数组采⽤的是直接寻址,⽽动态数组都是两次寻址,这和动态数组本⾝实现是有关系的。静态数组的变量本⾝就是数组第⼀个元素的地址。动态数组的变量存放的是⼀根指向到申请空间的⾸址指针。int arr[Size]中arr本⾝就是⼀个内存地址,⽽int *foo中foo是指针,指向了⼀个地址。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。