【问题标题】:passing 2d array into a function using only pointer and print the value仅使用指针将二维数组传递给函数并打印值
【发布时间】:2021-12-15 17:21:24
【问题描述】:

此程序(进程 9164)的结果以代码 -1073741819 退出。 程序完成并且没有任何反应.....我应该怎么做才能让它只使用没有 *x[] 或 x[][2] 的指针运行

#include <iostream>
#include<string>
#include <fstream>
using namespace std;
void sum(int **x) {
    int s = 0;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            cout << *(*(x + i) + j) << " ";
            s += *(*(x + i) + j);
        }
        cout << "\n";
    }
    cout << s;
}
int main() {
    int x[3][2] = { {11,15},{19,28},{5,8} };
    sum((int**)x);
    return 0;
}

【问题讨论】:

  • (int**)x 这样的C 风格转换可能非常危险。编译器不会告诉您x 肯定不是 int**。您的代码永远不会产生任何指向 int 的指针。

标签: c++ arrays pointers


【解决方案1】:

每当您觉得需要进行 C 风格转换时(就像您对 (int**)x 所做的那样),您应该将其视为您做错了什么的迹象。

数组数组与指向指针的指针相同。

如果你传递了一个无效的指针,程序会遇到未定义的行为崩溃

应该发生的是数组x衰减到指向其第一个元素的指针,即普通x&amp;x[0]相同。这将是一个指向 array 的指针,类型为 int (*)[2](在您的问题中为 x)。这是您需要用于函数参数的类型:

void sum(int (*x)[2]) { ... }

然后打电话

sum(x);

您还可以通过对维度使用模板参数并通过引用传递数组来泛化以接受任何类型的“2D”数组:

// For std::size_t
#include <cstdlib>

template<std::size_t A, std::size_t B>
void sum(int (&x)[A][B])
{
    // Use A and B as the sizes for the arrays...
    ...
}

虽然上面的模板版本更好,但 C++ 中的“正确”解决方案应该使用std::array,如:

std::array<std::array<int, 2>, 3> = { ... };

然后将其作为对函数的常量引用。

如果在编译时不知道大小,或者如果数组应该是动态的,那么请改用std::vector

一本好书和好老师会先教这些课程,然后再学习指针或 C 样式的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 2020-08-28
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多