【c++教程】2.5-数组类型

数组

如果每个数据,都需要一个新的变量才能保存的话,那么100个数据,就需要定义100个变量了。这显然不是我们希望的事情。因此,可以把单一的数据类型集合组在一起,也就是数组。

数组中可以保存多个数据,通过数据在数组中的位置来访问数据,也就是通过索引(下标)来进行访问。

定义一个数组

// 定义一个10个元素的数组
int arr[10];

按照规定来说,c++14以前,定义数组在指定元素个数的时候,必须使用一个常量表达式,非const变量不能用来定义数组。

const int a = 10;
int b = 10;

// a是一个const变量,可以
int arr1[a];

// b不是const变量,不可以
int arr2[b];

规定上应该是这样,但是真的使用的时候,会发现有些编译器确实可以不用常量表达式,也能正常定义和使用数组(这种实际情况和语法规则不符的事情,在c++中是常有发生的)。

定义数组的同时赋初值

#include <iostream>

using namespace std;

int main()
{
    // 使用花括号的形式,为数组赋初值
	int arr[3] = {1,2,3};

    // 如同代码中所看到的这样,数组是从0开始计数的
    // 也即第一个元素的下标为0
	cout << arr[0] << endl;
	cout << arr[1] << endl;
	cout << arr[2] << endl;

    // 在定义的时候如果就进行初始化,那么也可以不指定个数
    int arr2[] = {1,2,3}
}

注意:数组不可以用其他数组直接赋值,必须要按照顺序,把要拷贝的数组中的每一个元素都拷贝过去。

#include <iostream>

using namespace std;

int main()
{
    int arr1[3] = {1,2,3};

    // 这种赋值方式是不可以的
    // int arr2[3] = arr1;

    // 正确的赋值要像这样
    int arr2[3];
    arr2[0] = arr1[0];
    arr2[1] = arr1[1];
    arr2[2] = arr1[2];
    
    cout << arr2[0] << endl;
}

多维数组

通过多个方括号,可以指定一个多维数组,常见的二维数组类似于使用excel或者csv文件,可以通过行,列来对应到数据。

二维数组的定义

#include <iostream>

using namespace std;

int main()
{
    // 定义二维数组需要两个方括号
    // a[2][3]也可以理解为2行,3列
    int a[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    // 使用的时候也需要两个方括号
    cout << a[0][0] << endl;
    cout << a[0][1] << endl;
    cout << a[0][2] << endl;
    cout << a[1][0] << endl;
    cout << a[1][1] << endl;
    cout << a[1][2] << endl;
}

数组和指针的关系

一个数组,保存的就是这个数组的首个元素的地址,等同于指向首个元素的指针。

#include <iostream>

using namespace std;

int main()
{
    int a[3] = {1, 2, 4};
    int * p1 = a;
    int * p2 = &a[0];

    // 这样定义是不对的,因为&a不是int*类型
    // int * p3 = &a;

    cout << *p1 << endl;
    cout << *p2 << endl;

    // 我们可以观察到,使用数组名和取数组首元素的地址
    // 其使用效果上是一样的
    cout << *(p1 + 1) << endl;
    cout << *(p2 + 1) << endl;
}

因此,我们可以使用数组名,就像使用指针那样。

#include <iostream>

using namespace std;

int main()
{
    int a[3] = {1, 2, 4};

    cout << *a << endl;

    // 使用a + 1,我们可以取得数组中下一个元素的地址
    cout << *(a + 1) << endl;

    // 注意,由于运算符优先级的影响
    // *(a + 2)和*a + 2是不一样的
    // *(a + 2)的结果是4,*a + 2的结果为3
    cout << *a + 2 << endl;
}

数组和指针的区别

虽然数组名本身是一个指向数组首元素的指针,但是数组名本身不可以使用自增自减

#include <iostream>

using namespace std;

int main()
{
    const int size = 4;
    int arr[size] = {1, 2, 3, 4};
    int *p = arr;

    for (int i=0; i<size; ++i, ++p)
        cout << *p << endl;

    // 将指针换成数组名以后,该程序不正确
    // 因为数组不能使用自增
    // for (int i=0; i<size; ++i, ++arr)
    //     cout << *arr << endl;

    // 只能通过这种方式,达到类似的效果
    for (int i=0; i<size; ++i)
        cout << *(arr + i) << endl;
}

点击查看全部c++教程​​​​​​​

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值