【发布时间】:2021-10-24 08:18:36
【问题描述】:
我正在尝试熟悉指针,因此我正在编写一个代码,其中包含指向二维数组的指针。
这是我在 main 中的指针声明:
string board[10][10];
string *b = &board[0][0];
然后将指针传递给一个函数,我想使用指针将内容存储到该数组中。这就是问题所在。
void clearBoard(string *b) {
cout << " ";
for (int i = 1; i < 11; i++) {
cout << i << " ";
} cout << endl;
for (int r = 0; r < 10; r++) {
cout << r + 1;
if (r < 9) {
cout << " ";
} else {
cout << " ";
}
for (int c = 0; c < 10; c++) {
*(*(b + r) + c) = "-"; <-- where problem occurs
cout << *(*(b + r) + c) << " "; <-- i can imagine there's a problem here to
if (c == 9) {
cout << endl;
}
}
}
}
每当我尝试运行此程序时,都会出现:
error: no match for 'operator+' (operand types are 'std::__cxx11::string' {aka 'std::__cxx11::basic_string<char>'} and 'int')|
我相信我试图访问我的书向我展示的指针,所以我不确定我在这里做错了什么。
谢谢。
【问题讨论】:
-
我相信我试图访问我的书向我展示的指针, -- 我敢打赌你的书正在向你展示如何访问一维数组,而你'错误地尝试将其扩展到二维数组。我所知道的任何一本书都不会让 C++ 程序员以这种方式编写代码来操作 2D 数组。
-
数组数组与指向指针的指针不同。而且您甚至没有指向指针的指针。还要了解对于任何指针
p和索引i,表达式*(p + i)完全 等于p[i]。后者更容易阅读和理解。并且还解释了问题:*(*(b + r) + c)与b[r][c]相同,这没有意义。 -
顺便说一句,你的代码中有很多magic numbers,还有很多单字母无法辨认的变量。使用更长的描述性名称。
-
@PaulMcKenzie 我确信我的书是针对 2D 数组的,这个网站也是如此:overiq.com/c-programming-101/pointers-and-2-d-arrays。可能是因为我使用的是字符串而不是导致问题的整数?我不确定。 (我的书以 long 为例)
-
所有数组都可以衰减为指向其第一个元素的指针。对于“一维”数组,例如
string some_strings[X]然后它会衰减到&some_strings[0]类型为string*。你有一个“二维”数组(实际上是一个数组数组),它也会衰减到指向其第一个元素的指针:board[0]。但是在您的代码中,您有一个数组数组,因此指针类型 i 指向数组的指针(osstring)或string (*)[10]。这与您传递给clearBoard的参数非常不同. 您的变量b的类型错误,无法指向数组数组。