std :: string(*)[96] [60]和std :: string * [96] [60]之间有什么区别?

时间:2015-06-28 22:44:49

标签: c++ arrays pointers multidimensional-array

我有多个二维96 x 60 std::string数组。我正在尝试制作一个可以指向其中一个数组的指针。

数组看起来像这样:

std::string array1[96][60];
std::string array2[96][60];

我制作的指针看起来像这样:

std::string *ptr_to_array[96][60];

如果我只声明指针,那么所有内容都会编译。但是,当我尝试执行以下操作时

ptr_to_array = &array1;

我收到此错误:

error: incompatible types in assignment of ‘std::string (*)[96][60]’ to ‘std::string* [96][60]’

对我而言,两种类型都是相同的。

另外,根据我对此主题的看法,很多人建议使用std::array。我愿意,但在尝试处理多维std::array时,这似乎是一个比这更大的问题。我更愿意修复我的std::string数组,但只需切换到std::array会更好或更容易吗?

4 个答案:

答案 0 :(得分:1)

类型相同。 std::string* [96][60]是一个2D数组指针。 std::string (*)[96][60]是指向2D数组的指针。

  • 从字面上理解,你需要的东西是

    std::string (*ptr_to_array)[96][60];
    ptr_to_array = &array1;
    

    稍后您可以通过指针访问数组

    (*ptr_to_array)[i][j];
    

    在这种情况下,您确实将ptr_to_array声明为指向2D数组的指针。

  • 或者,您可以

    std::string (*ptr_to_array)[60];
    ptr_to_array = array1;
    

    以后再以

    的形式访问它
    ptr_to_array[i][j];
    

在初始化指针时,前一种变体将强制执行两种数组大小的完全匹配。后一种变体忽略了第一个数组大小。

  • 您还可以在第一个变体中使用对数组的引用

    std::string (&ref_to_array)[96][60] = array1;
    

    将保留“自然”数组访问语法

    ref_to_array[i][j];
    

    但必须在声明时初始化引用。

答案 1 :(得分:0)

如果我理解你的问题是正确的,那么你正在寻找什么呢?

std::string array1[3][3];
std::string array2[3][3];
auto* test = &array1;

std::cout << test[0] << std::endl;

test = &array2;

std::cout << test[0] << std::endl;

答案 2 :(得分:0)

我猜你想要一个能够以与原始数组相同的方式索引的指针:

#include <string>
#include <iostream>
using namespace std;

auto main() -> int
{
    string array1[96][60] = {{"Alpha", "Bravo", "Charlie"}};
    string array2[96][60];

    string (*p)[60] = array1;

    cout << array1[0][2] << endl;
    cout << p[0][2] << endl;
}

不是像上面那样直接对抗C语法,而是使用typedef或C ++ 11 using来定义类型的名称,这样可以更清楚:

#include <string>
#include <iostream>
using namespace std;

auto main() -> int
{
    using String_row    = string[60];
    using String_matrix = String_row[96];

    String_matrix array1 = {{"Alpha", "Bravo", "Charlie"}};
    String_matrix array2;

    String_row* p = array1;

    String_matrix* pa = &array1;

    cout << array1[0][2] << endl;
    cout << p[0][2] << endl;
    cout << (*pa)[0][2] << endl;
}

如果你真的想要指向数组本身的指针,而不是指向数组第一项的一个很好的可索引指针,那么在C语法级别它就像

string (*pa)[96][60] = &array1;

你会像

一样使用它
cout << (*pa)[0][2] << endl;

它与指向第一项的指针的内存地址相同,但类型略有不同。

所有这一切,我建议定义或使用基于std::vector的矩阵类作为存储提供程序,而不是直接使用原始数组。

答案 3 :(得分:0)

std::string *ptr_to_array[96][60];

不是指针的声明。它是指向std::string类型对象的2D指针数组的声明。

如果你想使用表达式

&array1

并将其分配给指针,然后必须将指针定义为

std::string ( *ptr_to_array )[96][60];
ptr_to_array  = &array1;

但我怀疑实际上你需要一个指向数组第一个元素的指针。在这种情况下,声明将类似于

std::string ( *ptr_to_array )[60];
ptr_to_array  = array1;