【问题标题】:C++ passing/accessing matrix by pointers [duplicate]C ++通过指针传递/访问矩阵[重复]
【发布时间】:2011-03-31 21:00:31
【问题描述】:

可能重复:
2D arrays with C++

嗨,我正在尝试将一个指针复制到一个矩阵,该矩阵是我要传递给 C++ 中的一个函数的。这是我的代码试图表达的内容

#include <iostream>
using namespace std;

void func( char** p  )
{
    char** copy = p;
    cout << **copy;
}

int main()
{   
    char x[5][5];
    x[0][0] = 'H';
    func( (char**) &x);
    return 0;
}

但是,这给了我一个 Seg Fault。有人可以解释一下(最好是详细一点)我错过了什么潜在的机制吗? (以及它的修复)

非常感谢:)

【问题讨论】:

标签: c++ pointers segmentation-fault pass-by-reference


【解决方案1】:

指向由 5 个 5 个字符组成的数组的数组的指针 (char x[5][5]) 的类型为“指向由 5 个 5 个字符组成的数组组成的数组的指针”,即 char(*p)[5][5]char** 类型与此无关。

#include <iostream>
using namespace std;

void func( char (*p)[5][5]  )
{
    char (*copy)[5][5] = p;
    cout << (*copy)[0][0];
}

int main()
{
    char x[5][5];
    x[0][0] = 'H';
    func(&x);
    return 0;
}

当然,还有许多其他方法可以通过引用或指针传递二维数组,正如 cmets 中已经提到的那样。最详细的参考可能是 StackOverflow 自己的 C++ FAQ,How do I use arrays in C++?

【讨论】:

  • 您的方式有效,但仅适用于第一个元素。尝试在 main() 中将 x[1][1] 设置为类似“-”,然后在“void func()”中检索它,它不起作用。我会试着弄清楚为什么,我想我实际上必须阅读这个。谢谢推荐
  • @David T:它适用于每个元素:ideone.com/hAITL
【解决方案2】:

char** 是指向指针(或指针数组)的指针。 &amp;x 不是其中之一 - 它是一个指向二维字符数组的指针,可以隐式转换为指向单个字符的指针 (char *)。编译器可能给了你一个错误,此时你输入了强制转换,但编译器试图告诉你一些重要的事情。

【讨论】:

  • 其实&amp;x是一个指向整个二维数组的指针。它的类型是char(*)[5][5]
  • @FredOverflow,我知道我的描述有问题,但我不知道最好的表达方式 - 你帮我弄清楚了,谢谢。
【解决方案3】:

试试这个而不是使用字符**:

#include <iostream>
using namespace std;

void func( char* &p  )
{
    char* copy = p;
    cout << copy[0];
}

int main()
{   
    char x[5][5];
    x[0][0] = 'H';
    func(&x[0]);
    return 0;
}

【讨论】:

  • 这与 NULL 终止无关
  • 我修正了我的回复,虽然乍一看它是别的东西。
  • 单个字符不需要以空值结尾。事实上,它不能。
  • 你在写东西之前有没有读过上面的cmets?
猜你喜欢
  • 2020-04-21
  • 2016-11-20
  • 2019-09-15
  • 2022-01-16
  • 2014-10-31
  • 2016-07-13
  • 2016-08-26
  • 2015-04-26
  • 2014-10-29
相关资源
最近更新 更多