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

 更新时间:2020年12月09日 15:43:42   作者:老张哈哈哈  
这篇文章主要介绍了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));

以上这篇c++ 数组定义及初始化详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言基于EasyX库实现有图形界面钟表

    C语言基于EasyX库实现有图形界面钟表

    这篇文章主要介绍了C语言基于EasyX库实现有图形界面钟表,直线转动端点计算,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++静态成员变量和静态成员函数的使用方法总结

    C++静态成员变量和静态成员函数的使用方法总结

    下面小编就为大家带来一篇C++静态成员变量和静态成员函数的使用方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 基于C++实现TCP聊天室功能

    基于C++实现TCP聊天室功能

    这篇文章主要为大家详细介绍了基于C++实现TCP聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C++子类父类成员函数的覆盖和隐藏实例详解

    C++子类父类成员函数的覆盖和隐藏实例详解

    这篇文章主要介绍了C++子类父类成员函数的覆盖和隐藏实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++ 使用PrintWindow实现窗口截图功能

    C++ 使用PrintWindow实现窗口截图功能

    这篇文章主要介绍了C++ 如何使用PrintWindow实现窗口截图功能,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • C++11 中的std::function和std::bind详解

    C++11 中的std::function和std::bind详解

    这篇文章主要介绍了C++ 11 std::function和std::bind,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10
  • C语言超详细讲解双向带头循环链表

    C语言超详细讲解双向带头循环链表

    带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单
    2023-02-02
  • C语言实现常用字符串库函数(推荐)

    C语言实现常用字符串库函数(推荐)

    这篇文章主要介绍了C语言实现常用字符串库函数,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • linux之sed命令的用法

    linux之sed命令的用法

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法
    2013-10-10
  • Unity3D实现经典小游戏Pacman

    Unity3D实现经典小游戏Pacman

    这篇文章主要介绍了基于Unity3D制作一做个经典小游戏Pacman,文中的示例代码讲解详细,对我们学习Unity3D有一定的帮助,感兴趣的小伙伴可以了解一下
    2021-12-12

最新评论