当前位置:主页 > 软件编程 > C代码 >

c++ 数组定义及初始化详解

时间:2021-07-02 08:56:05 | 栏目: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是指针,指向了一个地址。

补充知识:c++、c中数组初始化默认值如何为0

1、做全局变量

int sum[1000006];//初始化设默认值为0

2、做局部变量

默认值只能设为0,且只有在初始化时,才能设为0(sum[100]={0};这么写就是错的);

如果设为1,则只是sum[0]是1,其他默认全为0;

int sum[100]={0};//只能设为0

3、遍历赋值

实际意思和循环赋值0,是一样的,只不过这个是库封装好了的方法。

#include <cstring>//必须引用

memset(sum,0,sizeof(sum));

您可能感兴趣的文章:

相关文章