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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值