我有多个二维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
会更好或更容易吗?
答案 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;