我试图将二维字符数组放入函数中,但问题是: 两个维度的大小都是在主函数中使用“const int”参数声明的,我无法更改该部分。如果我现在尝试编译程序,编译器会说数组的大小未声明。
我试图通过使用指针和引用运算符来解决这个问题,但我在该领域的知识还不够丰富。我也尝试给程序一个提示,它将被声明,但它不起作用:
void test(const int a, const int b, char* array)
{ .......... }
int main()
{
const int a=2;
const int b=3;
char array[a][b];
......
test(a,b,&array);
}
test.cpp: In function 'int main()':
test.cpp:28:17: error: cannot convert 'char (*)[2][3]' to 'char*' for argument '3' to 'void test(int, int, char*)'
test(a,b,&array);
重点是,以类似的方式,我在函数之外得到了一个一维字符串数组,我尝试了其他方法,但出了问题:
void test(const int a, const int b, char* array)
{.........}
int main()
{
const int a=2;
const int b=3;
char * array = new char [a][b];
..........
test(a,b,*array);
}
test.cpp:20:31: error: cannot convert 'char (*)[3]' to 'char*' in initialization
char * array = new char [a][b];
test.cpp:5:6: note: initializing argument 3 of 'void test(int, int, char*)'
void test(const int a, const int b, char* array)
像这样
void test(const int a, const int b, char (*array)[3])
{
...
}
这也可以,(如果你愿意的话)
void test(const int a, const int b, char array[2][3])
{
...
}
还有这个(注意不是
&
)
test(a,b,array);
另一方面,如果您希望将任意大小的二维数组传递到常规函数中,那么这在 C++(或 C)中根本不可能。请改用 2D
std::vector
。
对于当前的 C++,请使用 std::array 作为固定样式数组,这也允许您在运行时获取它们的大小。理由:减少 C++ 中(原始)指针的使用。 (如C++核心指南中所述)
#include <array>
#include <iostream>
// Define compile time constants
static constexpr std::size_t rows_v = 2;
static constexpr std::size_t cols_v = 3;
// In C++ try to avoid "C" style arrays
// std::array may be a bit more typing but you can pass it easily to functions
// AND it will keep track of its sizes (which "C")
// It also allows you to return arrays from functions WITHOUT having to use pointers.
// I make a type alias here
using my_array_t = std::array<std::array<char, cols_v>, rows_v>;
// pass array by reference to avoid copies
// pass by const so that test only can read values (not modify them).
void test(const my_array_t& values)
{
// you can just get the size in the function
// by getting it from the array
std::cout << "The number of rows = " << values.size() << "\n";
std::cout << "The number of columns = " << values[0].size() << "\n";
// with arrays (and other containers) you can and
// should use range based for loops when you can.
for (const auto& row : values)
{
for (const auto& value : row)
{
std::cout << value << " ";
}
std::cout << "\n";
}
}
// To show you can return arrays from functions without pointers
// also do not worry C++ will not make unecessary copy of the
// returned array
my_array_t initialize_array()
{
my_array_t values{ { {'a','b','c'}, {'d','e','f'} } };
return values;
}
int main()
{
auto values = initialize_array();
test(values);
return 0;
}
这里有一个解决方案,将
array[0][0]
的地址传递给 test()
函数并将 2D char 数组视为 1D。
#include <iostream>
#include <string_view>
void test(int a, int b, char* array) {
for (int i = 0; i < a; i++) {
std::cout << std::string_view(array + i * b, b) << std::endl;
}
}
int main() {
const int a = 2;
const int b = 3;
char array[a][b];
array[0][0] = 'a';
array[0][1] = 'a';
array[0][2] = 'a';
array[1][0] = 'b';
array[1][1] = 'b';
array[1][2] = 'b';
test(a, b, &array[0][0]);
}
请注意,
const
的 const int a
限定符没有意义,可以省略。请参阅此TotW页面了解详细信息。
如果您想拥有 char 数组的只读视图并对其使用一些
std::string_view
方法,我还想提请您注意 std::string
(C++17 起)。 这是关于std::string_view
的很好的教程。