C/C++ 中的数组

简介: C/C++ 或任何编程语言中的数组是存储在连续内存位置的相似数据项的集合,可以使用数组的索引随机访问元素。它们可用于存储原始数据类型的集合,例如任何特定类型的 int、float、double、char 等。此外,C/C++ 中的数组可以存储派生的数据类型,例如结构、指针等。

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


C/C++ 或任何编程语言中的数组是存储在连续内存位置的相似数据项的集合,可以使用数组的索引随机访问元素。它们可用于存储原始数据类型的集合,例如任何特定类型的 int、float、double、char 等。此外,C/C++ 中的数组可以存储派生的数据类型,例如结构、指针等。


为什么我们需要数组?  


当我们有少量对象时,我们可以使用普通变量(v1, v2, v3, ..),但是如果我们要存储大量实例,用普通变量来管理它们就变得困难了。数组的想法是在一个变量中表示许多实例。\


通过指定大小声明数组

// 通过指定大小声明数组
int arr1[10];
// 使用最近的 C/C++ 版本,我们还可以声明一个用户指定大小的数组
int n = 10;
int arr2[n];
复制代码


通过初始化元素声明数组

// 通过初始化元素声明数组
int arr[] = { 10, 20, 30, 40 }
// 编译器创建一个大小为 4 的数组。上面与“int arr[4] = {10, 20, 30, 40}”相同
复制代码


通过指定大小和初始化元素来声明数组

// 通过指定大小和初始化元素来声明数组
int arr[6] = { 10, 20, 30, 40 }
// 编译器创建一个大小为 6 的数组,初始化用户指定的前 4 个元素,其余两个元素为 0。上面与“int arr[] = {10, 20, 30, 40, 0, 0}”相同
复制代码


C/C++ 中数组的优点:


  1. 使用数组索引随机访问元素。

  2. 使用更少的代码行,因为它创建了一个包含多个元素的数组。

  3. 轻松访问所有元素。

  4. 使用单个循环遍历数组变得容易。

  5. 排序变得容易,因为它可以通过编写更少的代码行来完成。


C/C++ 中数组的缺点:


  1. 允许输入在声明时决定的固定数量的元素。与链表不同,C 中的数组不是动态的。
  2. 由于需要根据新的内存分配来管理元素,因此插入和删除元素的成本可能很高。


关于 C/C++ 数组的事实:


  • 访问数组元素:

  • 使用整数索引访问数组元素。数组索引从 0 开始,一直到数组大小减 1。

  • 数组的名称也是指向数组第一个元素的指针。


例子:

#include <iostream>
using namespace std;
int main()
{
  int arr[5];
  arr[0] = 5;
  arr[2] = -10;
  // 这与 arr[1] = 2 相同
  arr[3 / 2] = 2;
  arr[3] = arr[0];
  cout << arr[0] << " " << arr[1] << " " << arr[2] << " "
    << arr[3];
  return 0;
}
**输出**
```c++
5 2 -10 5
复制代码


无索引  越界检查:C/C++ 中没有索引越界检查,例如,以下程序编译良好,但运行时可能会产生意外输出。


// 这个 C++ 程序编译得很好,因为在 C 中没有检查越界索引。
#include <iostream>
using namespace std;
int main()
{
  int arr[2];
  cout << arr[3] << " ";
  cout << arr[-2] << " ";
  return 0;
}
复制代码


输出

-449684907 4195777 
复制代码


在 C 中,用多于指定大小的元素初始化数组不是编译器错误。例如,下面的程序编译良好,只显示警告。


#include <stdio.h>
int main()
{
  // 通过使用比指定大小更多的元素对其进行初始化来声明数组。
  int arr[2] = { 10, 20, 30, 40, 50 };
  return 0;
}
复制代码


警告:

prog.c: In function 'main':
prog.c:7:25: warning: excess elements in array initializer
  int arr[2] = { 10, 20, 30, 40, 50 };
                         ^
prog.c:7:25: note: (near initialization for 'arr')
prog.c:7:29: warning: excess elements in array initializer
  int arr[2] = { 10, 20, 30, 40, 50 };
                             ^
prog.c:7:29: note: (near initialization for 'arr')
prog.c:7:33: warning: excess elements in array initixxalizer
  int arr[2] = { 10, 20, 30, 40, 50 };
                                 ^
prog.c:7:33: note: (near initialization for 'arr')
复制代码


注意: 该程序不会在 C++ 中编译。如果我们将上述程序保存为 .cpp,程序会生成编译器错误 “error: too many initializers for 'int [2]'”


元素存储在连续的内存位置


示例:

// C++ program to demonstrate that array elements
// are stored contiguous locations
#include <iostream>
using namespace std;
int main()
{
  int arr[5], i;
  cout << "Size of integer in this compiler is "
    << sizeof(int) << "\n";
  for (i = 0; i < 5; i++)
    cout << "Address arr[" << i << "] is " << &arr[i]
      << "\n";
  return 0;
}
复制代码


输出

Size of integer in this compiler is 4
Address arr[0] is 0x7ffe75c32210
Address arr[1] is 0x7ffe75c32214
Address arr[2] is 0x7ffe75c32218
Address arr[3] is 0x7ffe75c3221c
Address arr[4] is 0x7ffe75c32220
复制代码


Another way to traverse the array

#include<bits/stdc++.h>
using namespace std;
int main()
{
  int arr[6]={11,12,13,14,15,16};
  // Way -1
  for(int i=0;i<6;i++)
    cout<<arr[i]<<" ";
cout<<endl;
  // Way 2
  cout<<"By Other Method:"<<endl;
  for(int i=0;i<6;i++)
    cout<<i[arr]<<" ";
  cout<<endl;
  return 0;
}
复制代码


输出

11 12 13 14 15 16 
By Other Method:
11 12 13 14 15 16 
复制代码


数组 vs 指针


数组和指针是两个不同的东西(我们可以通过应用 sizeof 来检查)。发生混淆是因为数组名称表示第一个元素的地址,数组总是作为指针传递(即使我们使用方括号)。


C++中的向量是什么?


C++ 中的向量是 STL 中表示数组的类。向量相对于普通数组的优点是,


  • 当我们声明一个向量时,我们不需要传递大小作为额外的参数,即向量支持动态大小(我们不必最初指定向量的大小)。我们还可以调整向量的大小。


向量有许多内置功能,例如删除元素等。



目录
相关文章
|
2月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
74 4
|
6月前
|
存储 C++
C++指针数组
C++指针数组
43 1
|
6月前
|
存储 C++
C++程序数组与指针:深入理解与实践
C++程序数组与指针:深入理解与实践
65 1
|
2月前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
3月前
|
算法 C++
c++学习笔记04 数组
这篇文章是C++学习笔记4,主题是数组。
41 4
|
3月前
|
C++ 索引
C++数组、vector求最大值最小值及其下标
C++数组、vector求最大值最小值及其下标
100 0
|
4月前
|
C++ 索引 运维
开发与运维数组问题之在C++中数组名和指针是等价如何解决
开发与运维数组问题之在C++中数组名和指针是等价如何解决
29 6
|
4月前
|
存储 安全 C++
开发与运维数组问题之声明一个数组如何解决
开发与运维数组问题之声明一个数组如何解决
43 6
|
4月前
|
存储 C++ 容器
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
52 5
|
3月前
|
安全 编译器 C语言
C++入门-数组
C++入门-数组