c++基础(数组)

作者: zidea | 来源:发表于2019-04-30 10:19 被阅读2次
Cplusplus-tutorial-in-hindi.jpg

数组就是一些列具有相同类型变量集合,便于维护。可以将数组理解为一个变量的集合的变量。

数组声明

数组在声明的时候需要指定出数组中元素的类型和数组的大小

 int arr[5];

数组即指针

int main(int argc, char const *argv[])
{
    int arr[5];

    std::cout << arr << std::endl;

    std::cin.get();
}

运行代码,我们发现 arr 是一个内存地址,定义一个数组 arr 实际是一个指针类型,是一个数组的指针。

0x7ffeeafaa7f0

visual studio IDE 提供根据内存地址查看内存的功能,可以查看到数组是连续的内存的根据内存元素类型(也就是占用内存大小)以及数组的长度乘积所定。这里每个 int 占 4 字节。

数组还是一个有序的元素集合,这表示我们通过下标可以访问到数组的元素,在 c++ 下标是从 0 开始计算的,也有的语言是从 1 开始计算。

arr[0] = 1;

数组越界

当我们访问到那些不受我们控制的内存(arr[-1], arr[5]),编译时候就会抛出警告,不过编译还是成功。不过既然我们做出规定还是应该按规定办事,要不可能在以后存在隐患和问题,难于调试。

    arr[-1] = 1;
    arr[5] = 1;
warning: array index 5 is past the end of the array (which contains 5 elements)
      [-Warray-bounds]

数组的遍历

for (int i = 0; i < 5; i++)
    {
        std::cout << arr[i] << std::endl;
    }

进一步证明数组就是指针

int main(int argc, char const *argv[])
{
    int arr[5];

    int *prt = arr;

    for (int i = 0; i < 5; i++)
    {
        std::cout << prt[i] << std::endl;
    }

    std::cout << arr << std::endl;

    std::cin.get();
}

定义一个指针变量然后将数组 arr 赋值给这个变量。然后遍历 prt 可以得到同上面相同结果。

int main(int argc, char const *argv[])
{
    int arr[5];

    int *prt = arr;

    for (int i = 0; i < 5; i++)
    {
        prt[i] = 2;
    }

    *(prt + 2) = 5;

    for (int i = 0; i < 5; i++)
    {
        std::cout << prt[i] << std::endl;
    }

    std::cin.get();
}

在上面代码中我们可以通过移动指针位置来修改指定位置数组的值,prt + 2 为指针为 2 的元素然后,通过*(prt+2) 进行对其赋值,输入结果如下。

2
2
5
2
2

这里是 int 类型指针所以内存存储单元为 4 字节,所以指针移动 2 表示移动了 8 字节,已经知道字符是占一个字节,所以将指针修改用于存储字符(char*),现在是按字符的字节数来移动指针所以移动 8 字节。然后将其转换为指向数据类型为 int 的指针。

*(int *)((char *)prt + 8) = 5;

栈与堆

之前我们所定义数组都是位于栈内存而非堆内存,如果我们用 new 所创建的数组都是位于堆内存而非栈内存。

int main(int argc, char const *argv[])
{
    int arr[5];

    int *another_arr = new int[5];

    std::cin.get();
}

栈:是一种连续储存的数据结构,具有先进后出的性质。通常的操作有入栈(圧栈)、出栈和栈顶元素。想要读取栈中的某个元素,就要将其之前的所有元素出栈才能完成。类比现实中的箱子一样。

堆:是一种非连续的树形储存数据结构,每个节点有一个值,整棵树是经过排序的。特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。常用来实现优先队列,存取随意。

数组位于堆还是位于栈内存区别在于其生命周期。

    int *another_arr = new int[5];
    delete[] another_arr;

因为位于堆内存,所需需要手动释放内存,这里因为是数组所以通过delete[] 来代替delete 释放数组another_arr

class Tut
{
    int arr[5];
    Tut()
    {

        for (int i = 0; i < 5; i++)
        {
            arr[i] = 2;
        }
    }
};

上面 Tut 类中定义了一个数组,并且在构造函数对其进行赋值。然后我们打开内存查看器,就会发现这个数组内存地址位于该类中。

class Tut
{
    int *arr = new int[5];
    Tut()
    {

        for (int i = 0; i < 5; i++)
        {
            arr[i] = 2;
        }
    }
};

如果修改通过 new 在 Tut 类中创建数组就会发现,在类中仅有数组的指针地址,我们需要通过该地址可以访问到数组内存。

在 c++ 中我们无法通过 size 来像其他语言那样获取到数组的大小。

arr->size();

我们可以通过下面方法来间接获取数组的大小,通过数组所占字节数/数组元素类型所占的字节数,不过并不推荐这样使用我们需要自己来维护数组的大小。

    int arr[5];
    int count = sizeof(arr) / sizeof(int);
    std::cout << count << std::endl;

推荐自己控制数组的大小

class Tut
{
    static const int size = 5;
    int arr[size];

    Tut()
    {

        for (int i = 0; i < size; i++)
        {
            arr[i] = 2;
        }
    }
};

c++11

在 c++11版本支持标准库中的数组,而且也提供了便于操作的一些方法。

#include <iostream>
#include <array>
class Tut
{
    static const int size = 5;
    int arr[size];

    std::array<int, 5> another;

    Tut()
    {

        for (int i = 0; i < another.size(); i++)
        {
            another[i] = 2;
        }
    }
};

不过更多便利就是意味着更多性能的代价,个人推荐使用原生数组而不是c++ 提供数组。

相关文章

  • C++基本概念复习_2018-06-25

    C++基础 (1)C和C++的区别 C++分为: C部分(区块、语句、预处理器、内置数据类型、数组、指针等); 面...

  • [基础C++]:数组

    数组是一种类似vector的数据结构。与vector不同,数组大小固定不变。 维度必须是常量表达式 数组如果指明了...

  • c++基础(数组)

    数组就是一些列具有相同类型变量集合,便于维护。可以将数组理解为一个变量的集合的变量。 数组声明 数组在声明的时候需...

  • 第四章 控制执行流程

    本章都为基础 c c++ 相似略过很多章节只记重点 rang() 产生一个 数组 rang(10) 0...9 ...

  • 求职梳理

    笔试: 基础知识:乱七八糟 算法题:链表数组字符串树、栈、队列 面试: C++基础类继承多态C++11、STL、S...

  • NDK - JNI java类型转C++

    1、Java String 转 C++ String 2、 java 浮点型数组 转 C++ 浮点型数组 3、 ...

  • C++中传递数组给函数和函数返回指向数组的指针

    记录一: C++ 中可以通过指定 “不带索引的数组名” 来传递一个指向数组的指针。 C++ 传数组给一个函数,数组...

  • (转)使用MFC的数组类 vc多线程(续)关于_beginthr

    2012-03-28 MFC 的数组类支持的数组类似于C++中的常规数组,可以存放任何数据类型。C++的常规数组在...

  • 慕课网-C++远征之封装篇(下)-学习笔记

    C++远征之封装篇(下) c++封装概述 类 & 对象 对象+数据成员 = 对象成员 对象 + 数组 = 对象数组...

  • 面试常问C++基础

    有关语言基础: c/c++程序的编译过程(GCC的编译流程) 强类型语言 VS 弱类型语言 数组和指针的区别 字符...

网友评论

    本文标题:c++基础(数组)

    本文链接:https://www.haomeiwen.com/subject/yqxmnqtx.html