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++ 数组定义及初始化详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决C++全局变量只能初始化不能赋值的问题

    C++中,全局变量只能声明.初始化,而不能赋值 也就是说,下面这样是不被允许的: #include <cstdio> using namespace std; int a; a = 2; int main() { return 0; } 错误提示是: C++ requires a type specifier for all declarations 声明.初始化与赋值的区别: 声明:int a; 初始化:int a = 2;(在声明的时候顺带赋值叫做初始化) 赋值:a = 2; 只有定义(i

  • C++11特性小结之decltype、类内初始化、列表初始化返回值

    作用:返回表达式或变量的类型 返回值规则: 若e是一个左值(lvalue,即"可寻址值"),则decltype(e)将返回T& 若e是一个临终值(xvalue),则返回值为T&& 若e是一个纯右值(prvalue),则返回值为T decltype()不会执行括号内的表达式,decltype返回的类型是用于声明的,不能用于单纯的判断.比如decltype(a)==int,是不可以的,只能是在定义新的变量.返回值的地方使用: int a=1; decltype(a)

  • C++中静态初始化数组与动态初始化数组详解

    静态初始化的数组的长度必须是在程序中确定的常数,不能是由用户输入的变量 例子: int a[10];//正确 Student stud[10];//正确:Student是一个学生类 int n;cin>>n;int a[n];//错误 int n;cin>>n;Student stud[n];//错误:Student是一个学生类 动态初始化数组可以使用用户输入的变量作为数组的长度. 例子: int n; cin>>n; int *a=new int[n];//这样整数数

  • C++使用初始化列表的方式来初始化字段的方法

    几个月之前,接触Android recovery源代码的时候,看ScreenRecoveryUI类的时候,那时候C++基础还不是特别好,一直不明白以下的初始化方式: 下面这个是Recovery的一个构造函数,代码位于:screen_ui.cpp,它的类的实现在screen_ui.h. 如下这个ScreenRecoveryUI类,这个类是继承于RecoveryUI类的: 这个文件在screen_ui.h class ScreenRecoveryUI : public RecoveryUI { pu

  • c++ 子类构造函数初始化及父类构造初始化的使用

    我们知道,构造方法是用来初始化类对象的.如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数:并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建. 构造函数与父类的其它成员(成员变量和成员方法)不同,它不能被子类继承.因此,在创建子类对象时,为了初始化从父类中继承来的成员变量,编译器需要调用其父类的构造函数.如果子类的构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么事显式调用,在下面会详细说明!关于子类中构造函数的构造原则,总

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

    C ++提供了一种数据结构,即数组,该数组存储一个固定大小的由相同类型元素构成的顺序集合. 数组中的元素存储在一个连续内存位置中,元素可通过数组索引访问, 最低地址对应于第一个元素,最高地址对应于最后一个元素. 声明数组 例如 声明固定长度的数组: const int Size = 5; int arr[Size] = {3, 6, 9, 12, 15}; arr[3] = 42; 注意:方括号[]中的内容(表示数组中元素的数量)必须是一个常量表达式,因为数组是静态内存块,必须在编译时确定大小,

  • Java对象数组定义与用法详解

    本文实例讲述了Java对象数组定义与用法.分享给大家供大家参考,具体如下: 所谓的对象数组,就是指包含了一组相关的对象,但是在对象数组的使用中一定要清楚一点:数组一定要先开辟空间,但是因为其是引用数据类型,所以数组里面的每一个对象都是null值,则在使用的时候数组中的每一个对象必须分别进行实例化操作. 对象数组的声明 先定义,再开辟空间 类名称 对象数组名[] = null; 对象数组名 = new 类名称[长度]; 定义并开辟数组 类名称 对象数组名[] = new 类名称[长度]; 在声明对

  • C语言结构体数组的定义和使用详解

    目录 介绍 结构体数组定义时初始化 补充 介绍 一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗? 很明显不可能,这时就要使用数组.结构体中也有数组,称为结构体数组.它与前面讲的数值型数组几乎是一模一样的,只不过需要注意的是,结构体数组的每一个元素都是一个结构体类型的变量,都包含结构体中所有的成员项. 定义结构体数组的方法很简单,同定义结构体变量是一样的,只不过将变量改成数组.或者说同前面介绍的普通数组

  • TypeScript数组的定义与使用详解

    目录 基本定义 声明数组时直接初始化 访问数组 Array对象 声明数组时指定数组大小 两种定义方式 声明多维数组(含泛型) 普通版 泛型版 类数组 数组解构 通过接口描述数组 数组迭代 基本定义 声明数组时直接初始化 // 基本定义 let arr:number[] = [1,2,3]; let arrS: string[] = ["1","2"] 如果数组声明时未设置类型,则会被认为是 any 类型,在初始化时根据第一个元素的类型来推断数组的类型. 访问数组 A

  • C语言关键字union的定义和使用详解

    union,中文名"联合体.共用体",在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量. 但在"联合"中, 各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度 .一个联合体类型必须经过定义之后, 才能使用它,才能把一个变量声明定义为该联合体类型. 当定义结构对象时,如果没有显式地初始化它们,则会采用一般初始化规则:如果该结构对象属于动态存储类型,那么其成员具有不确定的初始值

  • C++中多态的定义及实现详解

    1. 多态概念 1.1 概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态. 举个栗子:比如买票,当普通人买票时,是全价买票:学生买票时,是半价买票:军人买票时是优先买票.同一个事情针对不同的人或情况有不同的结果或形态. 2. 多态的定义及实现 2.1 多态的构成条件 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为.比如Student继承了Person. Person对象买票全价,Student对象买票半价. 注意:那么在继

  • java数组算法例题代码详解(冒泡排序,选择排序,找最大值、最小值,添加、删除元素等)

    数组算法例题 1.数组逆序 第一个和最后一个互换,第二个和倒数第二个互换,就相当于把数组想下图一样,进行对折互换,如果数组个数为奇数,则中间保持不变其余元素互换即可 import java.util.Arrays; class Demo12 { public static void main (String[] args) { int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; System.out.println(Arrays.toString(arr));

  • 重学Go语言之数组的具体使用详解

    目录 什么是数组 数组的创建 访问数组的元素 数组的长度 如何遍历数组 数组的比较 查找数组中的元素 将数组作为函数参数 二维与多维数组 小结 什么是数组 什么是数组?数组是有固定长度的相同数据类型元素的集合, 如下图所示: 从数组的定义以及上面的示例图我们可以得到数组的三个特征: 固定长度,数组的长度在编译时就要确定. 每个元素的数据类型相同. 数组索引从0开始,索引的最大值为数组长度减1. 数组的创建 直接声明数组变量,在声明时必须指定长度: var iArray [2]int var sA

  • C++ 静态成员的类内初始化详解及实例代码

    C++ 静态成员的类内初始化详解及实例代码 一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++ 静态成员的"类内初始化"那就容易迷糊了. 我们来看如下代码: //example.h #include<iostream> #include<vector> using namespace std; class Example{ public: static double rate = 6.5; static const int vecSi

  • 基于java变量和作用域以及成员变量的默认初始化(详解)

    ava中的变量有成员变量和局部变量,定义在类中方法之外的变量成为成员变量或者成员字段(域),表示一个类所具有的属性,定义为类的成员变量的变量的作用于是整个类,该变量在定义的时候不需要初始化,在使用前java会自动初始化成员变量,对于基本数据类型的的自动初始化如下: java基本类型默认初始化值 int 0 short 0 byte 0 long 0 float 0.0 double 0.0 boolean false char 0 例如: public class test{ private i

随机推荐