我声明了一个数组square[10][10]
,我想初始化它只包含一个。 (我已经使用普通的初始化程序将它声明为全零,但这只是因为当我在调试时打印它时数组没有垃圾)。我可以使用double for循环轻松初始化但我尝试使用指向square
行的指针数组。这是我的代码。
#include <iostream>
using namespace std;
void initToOnes(int (*row)[10]) {
for (int *rowp = row[0]; rowp != row[0] + 100; rowp += 10) {
for (int *cs = rowp; cs != rowp + 10; ++cs)
*cs = 1;
}
}
int main()
{
int square[10][10] = {0};
int (*row)[10] = square;
initToOnes(row);
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++)
cout << square[i][j] << ' ';
cout << '\n';
}
}
现在这有效,虽然我不完全确定原因。函数initToOnes
接收指向10个int的块的指针。那么,在函数的外部for循环中,rowp++
是否足以将指针递增以指向第二行的整数?换句话说,我可以将相同的函数转换为双循环,如下所示:
for (pointer rowp; rowp != row + 10; ++rowp){
// inner loop;
}
现在,这个函数的工作方式似乎有点扼杀了指向某些行的指针。这种方式(我猜)我可以将指针发送到square
中的第一个条目,并在外部for循环中将其递增10以在行上运行。这个实现是否很差,并且无法定义指向行的指针?谢谢!
编辑:评论和答案消除了混乱。我将rowp
声明为指向int的指针,因此当然++rowp
只指向下一个int而不是下一行。这是我更新的解决方案
#include <iostream>
using namespace std;
void initToOnes(int (*row)[10]) {
for (int (*rowp)[10] = row; rowp != row + 10; ++rowp) {
for (int *cs = *rowp; cs != *rowp + 10; ++cs)
*cs = 1;
}
}
int main()
{
int square[10][10] = {0};
int (*row)[10] = &square[0];
initToOnes(row);
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++)
cout << square[i][j] << ' ';
cout << '\n';
}
}
答案 0 :(得分:1)
在外循环中,循环变量是
int *rowp;
这意味着递增它会增加rowp
以指向下一个整数。
这就是故事的结局。完全停止。
rowp
所指向的内存区域在逻辑上被划分为一系列10个int
s的事实并未改变rowp
指向的int
的基本事实。一个int
,而不是十个int
的数组。
现在,如果你想用指向十int array[10][10];
int (*p)[10] = &array[0];
的指针做一些事情:
p
现在,您可以说服自己增加Error: /Users/danieloram/desktop/CordovaProject/platforms/android/gradlew: Command failed with exit code 1 Error output:
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/dx/command/Main : Unsupported major.minor version 52.0
将提升10个整数。如何改进循环以使用这样的指针应该是显而易见的。实际上,您已经将正确的变量作为参数传入。使用它。