【Linux C++ 系列 】03 C++ 数组

举报
jackwangcumt 发表于 2022/07/04 08:54:13 2022/07/04
【摘要】  C++数组中可以存储多个同类型的值,在内存中的地址也是连续的,这样可以更加高效的进行数组元素的存取操作。对于维护多个值来说,利用数组可以让代码更加的简洁,操作也更加的方便。但是,C++数组在定义时,需要指定初始大小,如果申请过大,则造成内存浪费,如果过小,则可能导致程序出现意外的情况。在C++语言中,支持一维数组,二维数组和高维素组。

1 数组的优势


     C++数组中可以存储多个同类型的值,在内存中的地址也是连续的,这样可以更加高效的进行数组元素的存取操作。对于维护多个值来说,利用数组可以让代码更加的简洁,操作也更加的方便。但是,C++数组在定义时,需要指定初始大小,如果申请过大,则造成内存浪费,如果过小,则可能导致程序出现意外的情况。在C++语言中,支持一维数组,二维数组和高维素组。

2 一维数组示例


     C++一维数组是非常常用的一种数组,可以方便的管理多个同类型的数据。下面给出简单的一维数组示例:

#include <iostream>
using namespace std;
 
int main()
{
    int arr1[100];
    int idx = 0;
    for( ; ; ){
        if (idx >= 100){
            break;
        }else{
            arr1[idx] = idx + 1 ;
        }
        idx += 1 ;
    }
    
    int len = sizeof(arr1)/sizeof(arr1[0]);
    for(int i = 0 ; i < len ; i++){
       cout << arr1[i] << endl;
    }
    cout << "======================" << endl;
    cout << arr1[100] << endl;
    cout << "======================" << endl;
    int arr2[6] = { 10, 20, 30, 40 };
    int len_arr2 = distance(begin(arr2), end(arr2));
    cout << len_arr2 << endl;
    cout << arr2[0] << endl;
    cout << "======================" << endl;
    int arr3[2];
    cout << arr3[3] << endl;
    cout << arr3[-100] << endl;
 
    return 0;
}

    C++中  int arr1[100] 定义了一个长度为100,可以存储Int类型的数组,数组名为 arr1 。这里在定义时若不指定初始值,则必须要给定数组长度。下面用for ( ; ; ) 这个循环来自动填充数组arr1  。数组可以通过下标进行访问,下标从 0  开始 。获取数组的长度,可以用 sizeof(arr1)/sizeof(arr1[0]) 来获取,这样就可以通过循环下标来遍历数组。当然了,还可以通过 int arr2[6] = { 10, 20, 30, 40 } 来定义数组,此时给定了初始化值,这里定义的数组长度为 6 ,但可以只给部分值,而缺失的值为系统默认值0 。
    注意: C++中,数组可以进行越界访问,且不抛出错误,只是这个越界访问的值是未知的,arr3[2]长度为2,但是却可以访问arr3[3]和arr3[-100]的值,因此一定要小心。
    执行如下代码进行编译和执行:

g++ demo01.cpp -o demo01
./demo01 

   输出结果如下所示:

01.jpg

3 二维数组示例


     C++二维数组和一维数组类似。下面给出简单的二维数组示例:

#include <iostream>
using namespace std;
 
int main()
{
    
    int arr_2[3][2] = {
        {0,1}, 
        {2,3}, 
        {4,5}
    };
    cout << " sizeof(int) = " << sizeof(arr_2[0][0]) << endl;
    cout << " arr_2 = " << arr_2 << endl;
    cout << " &arr_2 = " << &arr_2 << endl;
    cout << " *arr_2 = " << *arr_2 << endl;

    for (int i = 0; i < 3 ; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            cout << " arr_2[" << i << "][" << j << "] -> " << arr_2[i][j]<< endl;
            cout << " *(*(arr_2 + " << i << ")+" << j << ") -> " << *(*(arr_2 + i)+j)<< endl;
            cout << " (*(arr_2 + " << i << ")+" << j << ") -> " << (*(arr_2 + i)+j)<< endl;
            cout << " **arr_2 + " << i << " + " << j << " -> " << **arr_2 + i + j << endl;
        }
    }

    return 0;
}

     其中, int arr_2[3][2] 定义了一个二维数组,具备3行2列。sizeof(arr_2[0][0]) 可以获取单个数组元素的长度,可以作为在内存中的偏移量。arr_2 , &arr_2 和 *arr_2 都是作为二维数组arr_2[0][0]的内存地址。访问二维数组可以通过下标,也可以通过指针的偏移操作来完成。

执行如下代码进行编译和执行:

g++ demo02.cpp -o demo02
./demo02

   输出结果如下所示:

02.jpg
(*(arr_2 + i)+j) 可以输出每个元素的内存地址,从地址来看,偏移为4,且内存连续。**arr_2 则是取的数组arr_2 第一行第一列的值,即 0 。

4 三维数组示例


     下面给出简单的三维数组示例:

#include <iostream>
using namespace std;
 
int main()
{
    // 24 = 3 * 2 * 4 
    int arr_3[3][2][4] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};
   
    cout << " arr_3 = " << arr_3 << endl;
    cout << " &arr_3 = " << &arr_3 << endl;
    cout << " *arr_3 = " << *arr_3 << endl;

    for (int i = 0; i < 3 ; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            for (int k = 0; k < 4; k++)
            {
                cout << " arr_3[" << i << "][" << j << "][" << k << "] -> " << arr_3[i][j][k]<< endl;
                cout << " (*(*(arr_3 + " << i << ")+" << j << ")+" << k << ") -> " << (*(*(arr_3 + i)+j)+k) << endl;
                cout << " *(*(*(arr_3 + " << i << ")+" << j << ")+" << k << ") -> " << *(*(*(arr_3 + i)+j)+k) << endl;
            }
        }
    }

    return 0;
}

执行如下代码进行编译和执行:

g++ demo03.cpp -o demo03
./demo03

   输出结果如下所示:

  arr_3 = 0x7ffc353746e0
 &arr_3 = 0x7ffc353746e0
 *arr_3 = 0x7ffc353746e0
 arr_3[0][0][0] -> 0
 (*(*(arr_3 + 0)+0)+0) -> 0x7ffc353746e0
 *(*(*(arr_3 + 0)+0)+0) -> 0
 arr_3[0][0][1] -> 1
 (*(*(arr_3 + 0)+0)+1) -> 0x7ffc353746e4
 *(*(*(arr_3 + 0)+0)+1) -> 1
 arr_3[0][0][2] -> 2
 (*(*(arr_3 + 0)+0)+2) -> 0x7ffc353746e8
 *(*(*(arr_3 + 0)+0)+2) -> 2
 arr_3[0][0][3] -> 3
 (*(*(arr_3 + 0)+0)+3) -> 0x7ffc353746ec
 *(*(*(arr_3 + 0)+0)+3) -> 3
 arr_3[0][1][0] -> 4
 (*(*(arr_3 + 0)+1)+0) -> 0x7ffc353746f0
 *(*(*(arr_3 + 0)+1)+0) -> 4
 arr_3[0][1][1] -> 5
 (*(*(arr_3 + 0)+1)+1) -> 0x7ffc353746f4
 *(*(*(arr_3 + 0)+1)+1) -> 5
 arr_3[0][1][2] -> 6
 (*(*(arr_3 + 0)+1)+2) -> 0x7ffc353746f8
 *(*(*(arr_3 + 0)+1)+2) -> 6
 arr_3[0][1][3] -> 7
 (*(*(arr_3 + 0)+1)+3) -> 0x7ffc353746fc
 *(*(*(arr_3 + 0)+1)+3) -> 7
 arr_3[1][0][0] -> 8
 (*(*(arr_3 + 1)+0)+0) -> 0x7ffc35374700
 *(*(*(arr_3 + 1)+0)+0) -> 8
 arr_3[1][0][1] -> 9
 (*(*(arr_3 + 1)+0)+1) -> 0x7ffc35374704
 *(*(*(arr_3 + 1)+0)+1) -> 9
 arr_3[1][0][2] -> 10
 (*(*(arr_3 + 1)+0)+2) -> 0x7ffc35374708
 *(*(*(arr_3 + 1)+0)+2) -> 10
 arr_3[1][0][3] -> 11
 (*(*(arr_3 + 1)+0)+3) -> 0x7ffc3537470c
 *(*(*(arr_3 + 1)+0)+3) -> 11
 arr_3[1][1][0] -> 12
 (*(*(arr_3 + 1)+1)+0) -> 0x7ffc35374710
 *(*(*(arr_3 + 1)+1)+0) -> 12
 arr_3[1][1][1] -> 13
 (*(*(arr_3 + 1)+1)+1) -> 0x7ffc35374714
 *(*(*(arr_3 + 1)+1)+1) -> 13
 arr_3[1][1][2] -> 14
 (*(*(arr_3 + 1)+1)+2) -> 0x7ffc35374718
 *(*(*(arr_3 + 1)+1)+2) -> 14
 arr_3[1][1][3] -> 15
 (*(*(arr_3 + 1)+1)+3) -> 0x7ffc3537471c
 *(*(*(arr_3 + 1)+1)+3) -> 15
 arr_3[2][0][0] -> 16
 (*(*(arr_3 + 2)+0)+0) -> 0x7ffc35374720
 *(*(*(arr_3 + 2)+0)+0) -> 16
 arr_3[2][0][1] -> 17
 (*(*(arr_3 + 2)+0)+1) -> 0x7ffc35374724
 *(*(*(arr_3 + 2)+0)+1) -> 17
 arr_3[2][0][2] -> 18
 (*(*(arr_3 + 2)+0)+2) -> 0x7ffc35374728
 *(*(*(arr_3 + 2)+0)+2) -> 18
 arr_3[2][0][3] -> 19
 (*(*(arr_3 + 2)+0)+3) -> 0x7ffc3537472c
 *(*(*(arr_3 + 2)+0)+3) -> 19
 arr_3[2][1][0] -> 20
 (*(*(arr_3 + 2)+1)+0) -> 0x7ffc35374730
 *(*(*(arr_3 + 2)+1)+0) -> 20
 arr_3[2][1][1] -> 21
 (*(*(arr_3 + 2)+1)+1) -> 0x7ffc35374734
 *(*(*(arr_3 + 2)+1)+1) -> 21
 arr_3[2][1][2] -> 22
 (*(*(arr_3 + 2)+1)+2) -> 0x7ffc35374738
 *(*(*(arr_3 + 2)+1)+2) -> 22
 arr_3[2][1][3] -> 23
 (*(*(arr_3 + 2)+1)+3) -> 0x7ffc3537473c
 *(*(*(arr_3 + 2)+1)+3) -> 23

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。