使用指向2D数组行的指针来初始化其值。为什么这样做?

时间:2016-10-10 13:01:32

标签: c++ arrays pointers

我声明了一个数组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';
    }
}

1 个答案:

答案 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个整数。如何改进循环以使用这样的指针应该是显而易见的。实际上,您已经将正确的变量作为参数传入。使用它。