【问题标题】:Assigning value to two dimensional array with the use of pointers C++使用指针 C++ 为二维数组赋值
【发布时间】:2018-10-20 14:44:00
【问题描述】:

我有一个任务说:“你的任务是用将把它变成乘法表的值填充 10x10 矩阵。你不能使用括号。你不能使用索引。所以,你必须使用指针。”

输出应该如下: 10x10 multiplication table

这就是我最终得到的解决方案:

#include <iostream> 
using namespace std; 
int main(void) {
int matrix[10][11] = {};

    for(int i = 0; i <= 10; i++) {
        for(int j = 0; j <= 10; j++) {
            matrix[i-1][j-1]= i*j;
        }
    }

    for(int i = 0; i < 10; i++) {
        for(int j = 0; j < 10; j++) {
        cout.width(4);
        cout << matrix[i][j]; }

        cout << endl;
    } 
}

我试图考虑如何使用指针而不是索引,但我可以找到有关如何将指针与二维数组一起使用的任何信息。

我刚开始学习 C++,如果您的帮助描述性足以让我理解并且以最简单的形式提供,那就太好了。

谢谢!

【问题讨论】:

  • matrix[i-1][j-1] 如果ij 都是0,这会产生什么元素索引?
  • You mustn't use brackets 这有点模棱两可
  • 如果只有 10 行和 10 列,为什么需要 10x11 矩阵
  • 不久前我写了一个tutorial 用于介绍取消引用和数组索引语法之间的关系的 CS 类。它还解释了如何理解如何在逐步取消引用多维数组/多级指针的同时识别“你在哪里”以及你拥有什么类型。请特别参阅取消引用部分。

标签: c++ arrays pointers matrix multidimensional-array


【解决方案1】:

你可以的

#include <iostream> 
using namespace std; 
int main(void) {
int matrix[11][11] = {};

    for(int i = 1; i <= 10; i++) {
        for(int j = 1; j <= 10; j++) {
            *(*(matrix + i - 1) + j - 1) = i * j;
        }
    }

    for(int i = 0; i < 10; i++) {
        for(int j = 0; j < 10; j++) {
        cout.width(4);
        cout << matrix[i][j]; }

        cout << endl;
    } 
}

int[][] 可以用作int**

所以矩阵可以被视为int***(matrix + i)matrix[i] 是一回事

【讨论】:

  • "int[][] 等同于 int**" 不,不是。
  • 它们并非在所有方面都等效,但您可以将 int[][] 用作 int**
  • 现在您可以安全地分配 10x10 数组
  • @Tyker 谢谢你,现在我对它的工作原理有了更好的了解!
【解决方案2】:

理解你的赋值是什么的关键是理解变量在内存中的布局。链接:Array declaration

T a[N]; 形式的声明,将 a 声明为由 N 连续分配的 T 类型的对象组成的数组对象。

声明:int matrix[10][11] 表示有 10 个数组,每个数组包含 11 个 int。

但是因为这也是连续的,这意味着这也可以解释为10*11 = 110 连续整数。 int matrix_1D[ 110 ];

那么如何获取这些元素呢?

通常这是通过第一个元素的地址完成的:&amp;matrix[0][0]

结果:

const int n = 10;
const int m = 10;
int matrix[ n ][ m ];

int* matrix_ptr = &matrix[0][0];

for ( int i = 1; i <= n; ++i )
    for ( int j = 1; j <= m; ++j )
    {
        *matrix_ptr = i * j;
        ++matrix_ptr;
    }

通过使用++ 运算符,指针将移动到下一个元素。

对于输出,更好的选择是使用Range-based for loop

for ( const auto& row : matrix )
{
    for ( const auto& num: row )
    {
        std::cout << std::setw( 4 ) << num;
    }
    std::cout << '\n';
}

【讨论】:

    【解决方案3】:

    这是我想出的最终解决方案:

        int matrix[10][10];
    
        // *(*(matrix + 0)+1); -----> matrix[0][1]
        // int** ----> int[][]
    
        for(int i = 1; i < 11; ++i) {
            for(int j = 1; j < 11; ++j)
                *(*(matrix+i-1)+j-1)=i*j;
            }
    
        for(int i = 0; i < 10; i++) {
            for(int j = 0; j < 10; j++) {
            cout.width(4);
            cout << matrix[i][j]; }
    
            cout << endl;}
    

    谢谢大家!

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-03
    • 2012-05-09
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    相关资源
    最近更新 更多