【Linux C++ 系列 】03 C++ 数组
【摘要】 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
输出结果如下所示:
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
输出结果如下所示:
(*(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)