C++笔记--数组

Posted ljt2724960661

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++笔记--数组相关的知识,希望对你有一定的参考价值。

           C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。

         数组定义是具有编译确定意义的操作,它分配固定大小的空间,就像变量定义一样的明确。因此元素个数必须是由编译时就能够定夺的常量表达式。下面这样的数组定义有问题:

int n=100;
int a[n];//错:数组元素个数必须是常量

分析: 虽然根据上下文,编译似乎已经知道n的值,但编译动作因变量性质而完全不同。变量性质就是具有空间占用的可访问实体,编译每次碰到一个变量名称就对应一个访问空间的操作。因此,int a[n]实际上要在运行时,才能读取变量n的值,才能确定其空间大小。这与数组定义的编译时确定意义的要求相违背,因而编译时报错。

        而对于下面的定义,却是允许的。因为编译中,常量虽也占空间,甚至也涉及内存访问,但因数据确定,而可以被编译用常数替代。事实上,常量在编译时经常是优化的目标,能省略内存空间访问就应该省略,讲求效率的C++编译器会乐此不疲:

const int n=100;
int a[n]; // ok

初始化数组

在 C++ 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:

double balance[5] = 1000.0, 2.0, 3.4, 7.0, 50.0;

大括号 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。如果省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:

double balance[] = 1000.0, 2.0, 3.4, 7.0, 50.0;

栗子:

#include <iostream>
using namespace std;

int main() 

  double numbers[] = 7, 5, 6, 12, 35, 27;
  double sum = 0;
  double count = 0;
  double average;

  cout << "The numbers are: ";

  for (const double &n : numbers) 
    cout << n << "  ";
    sum += n;
    // count the no. of array elements
    ++count;
  
  cout << "\\nTheir Sum = " << sum << endl;
  average = sum / count;
  cout << "Their Average = " << average << endl;
  return 0;

输出:

The numbers are: 7  5  6  12  35  27
Their Sum = 92
Their Average = 15.3333

多维数组

多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组,形式如下:type arrayName [ x ][ y ];其中,type 可以是任意有效的 C++ 数据类型,arrayName 是一个有效的 C++ 标识符。一个二维数组可以被认为是一个带有 x 行和 y 列的表格。

栗子:

#include <iostream>
using namespace std;

int main() 
    int test[3][2] = 2, -5, 4, 0, 9, 1;

    for (int i = 0; i < 3; ++i) 
        for (int j = 0; j < 2; ++j) 
            cout << "test[" << i << "][" << j << "] = " << test[i][j] << endl;
        
    
    return 0;

输出:

test[0][0] = 2
test[0][1] = -5
test[1][0] = 4
test[1][1] = 0
test[2][0] = 9
test[2][1] = 1

指向数组的指针

数组名是指向数组中第一个元素的常量指针。因此,在下面的声明中:double runoobAarray[50];

       runoobAarray 是一个指向 &runoobAarray[0] 的指针,即数组 runoobAarray 的第一个元素的地址。因此,下面的程序片段把 p 赋值为 runoobAarray 的第一个元素的地址:

double *p;
double runoobAarray[10];
p = runoobAarray;

使用数组名作为常量指针是合法的,反之亦然。因此,*(runoobAarray + 4) 是一种访问 runoobAarray[4] 数据的合法方式。一旦您把第一个元素的地址存储在 p 中,您就可以使用 *p、*(p+1)、*(p+2) 等来访问数组元素。

栗子:

#include <iostream>
using namespace std;
 
int main ()

   double runoobAarray[5] = 200.0, 2.0, 3.5, 18.0, 90.0;
   double *p;
 
   p = runoobAarray;
   cout << "使用指针的数组值 " << endl; 
   for ( int i = 0; i < 5; i++ )
   
       cout << "*(p + " << i << ") : ";
       cout << *(p + i) << endl;
   
 
   cout << "使用 runoobAarray 作为地址的数组值 " << endl;
   for ( int i = 0; i < 5; i++ )
   
       cout << "*(runoobAarray + " << i << ") : ";
       cout << *(runoobAarray + i) << endl;
   
   return 0;

输出:

*(p + 0) : 200
*(p + 1) : 2
*(p + 2) : 3.5
*(p + 3) : 18
*(p + 4) : 90
使用 runoobAarray 作为地址的数组值 
*(runoobAarray + 0) : 200
*(runoobAarray + 1) : 2
*(runoobAarray + 2) : 3.5
*(runoobAarray + 3) : 18
*(runoobAarray + 4) : 90

以上是关于C++笔记--数组的主要内容,如果未能解决你的问题,请参考以下文章

C++链表学习笔记

C++链表学习笔记

C++ primer puls 学习笔记

C++学习笔记

LeetCode1684. 统计一致字符串的数目(C++)

重学C++:笔记C++基础容器&C++指针引用