《C++ primer》练习3.43-3.45: 打印二维数组的元素

文章目录

  • 1. 使用范围for循环
  • 2. 使用普通for循环
    • 2.1 使用指针
    • 2.2 使用数组下标
  • 类型别名的简化

本文来自于《C++ primer》的练习3.43-3.45,觉得多维数组的遍历有不同的实现方式,于是记录一下。写的可能没有按题目的顺序来。题目大概含义是定义了一个二维数组的元素,要求按照行列打印出来(用不同的方式)。

《C++ primer》练习3.43-3.45: 打印二维数组的元素_第1张图片

初始代码

#include 
#include 
using namespace std;
int main()
{
  int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
  
  \*
  write your code
  *\
}

输出结果

在这里插入图片描述

1. 使用范围for循环

这里使用auto关键字

#include 
#include 
using namespace std;
int main()
{
  int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
  
  for (auto &p : a)
  {
    for (auto &q : p)
      cout << q << ' ';
    cout << endl;
  }
}

p和q的类型是什么?

auto &p ↔ \leftrightarrow int (&p)[4] ,代表一个引用,引用对象是整型的长度为4的数组
auto &q ↔ \leftrightarrow int (&q) ,代表一个引用,引用对象是整型
上面的代换可以直接代入代码中。

2. 使用普通for循环

2.1 使用指针

使用指针有两种方式:

一种方式是直接进行指针操作

#include 
#include 
using namespace std;
int main()
{
  int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
  
  for (auto p = a; p != a + 3; ++p)
  {
    for (auto q = *p; q != *p + 4; ++q)
      cout << *q << ' ';
    cout << endl;
  }
}

另一种方式是使用标准库函数beginend得到数组的头元素指针和尾后元素指针(数组最后一个元素后一个位置的指针):

#include 
#include 
using namespace std;
int main()
{
  int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
  
  for (auto p = begin(a); p != end(a); ++p)
  {
    for (auto q = begin(*p); q != end(*p); ++q)
      cout << *q << ' ';
    cout << endl;
  }
}

p和q的类型是什么?

auto p ↔ \leftrightarrow int (*p)[4] ,代表一个指针,指向的对象是整型的长度为4的数组
auto q ↔ \leftrightarrow int (*q) ,代表一个指针,指向的对象是整型

2.2 使用数组下标

#include 
#include 
using namespace std;
int main()
{
  int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
  
  for (size_t i = 0; i != 3; ++i)
  {
    for (size_t j = 0; j != 4; ++j)
      cout << a[i][j] << ' ';
    cout << endl;
  }
}

上面的p对应的类型是int[4](长度是4的整型数组),我们可以使用类型别名简化。

类型别名的简化

这里以指针为例,引用也是一样的

第一种写法用的是using关键字

#include 
#include 
using namespace std;
using int_array = int[4];
// typedef int int_array[4];
int main()
{
  int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};

  for (int_array *p = a; p != a + 3; ++p)
  {
    for (int *q = *p; q != *p + 4; ++q)
      cout << *q << ' ';
    cout << endl;
  }
}

另一种写法是使用typedef关键字

#include 
#include 
using namespace std;
typedef int int_array[4];
int main()
{
  int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};

  for (int_array *p = a; p != a + 3; ++p)
  {
    for (int *q = *p; q != *p + 4; ++q)
      cout << *q << ' ';
    cout << endl;
  }
}

参考

  1. 《C++ primer》112-116

你可能感兴趣的:(C和C++,c++,二维数组,指针,引用)