0

我有一个 bool array[size][size] 并且想将它的指针传递给一个函数来改变它的值。

void change_to_true(???, int i, int j) { // don't know what type it should be
  array[i][j] = 1;
}

如何创建数组的指针,以及如何将指针传递给函数以便更改其值?顺便说一句,这是c代码。

谢谢

编辑:我试过

static bool array[size][size];
bool (*array_t)[index] = array;
void change_to_true(bool array, int i, int j);

编译器告诉我subscripted value is neither array nor pointer 我试图将函数参数的类型定义从 to 更改bool arraybool* array,仍然无法正常工作。

我也尝试过bool (*array_t)[][size] = &array指针bool (*array_t)[size][size] = &array;,仍然无法正常工作。

此外,由于数组的大小是在运行时决定的,所以我不能以这种方式定义枚举或全局数组。

4

4 回答 4

1

简单的解决方案——但没有指向二维数组的指针

该功能应该很简单:

#include <stdbool.h>

enum { size = 24 };

extern void change_to_true(bool array[][size], int i, int j);

void change_to_true(bool array[][size], int i, int j)
{
    array[i][j] = true;
}

int main(void)
{
    bool array[size][size];

    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
             array[i][j] = false;
             change_to_true(array, i, j);
        }
    }
}

当然,我假设您拥有 C99 或 C2011 编译器。如果您坚持使用 C89,那么您必须为booland提供定义true;其余的不需要改变。与false.

使用指向二维数组的指针的解决方案

请注意,上面的代码严格来说并没有创建指向二维数组的指针。如果你真的非常确定这是你想要的,那么符号就会改变:

#include <stdbool.h>

enum { size = 24 };

extern void change_to_true(bool (*array)[][size], int i, int j);

void change_to_true(bool (*array)[][size], int i, int j)
{
    (*array)[i][j] = true;
}

int main(void)
{
    bool array[size][size];

    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
             array[i][j] = false;
             change_to_true(&array, i, j);
        }
    }
}

但是,使用我能想到的正式的“指向数组的指针”没有任何好处——不是在这种情况下。

使用 C99 可变长度数组的解决方案

在 C99 中,您还可以使用 VLA(可变长度数组),如下所示:

#include <stdbool.h>

extern void change_to_true(int size, bool array[][size], int i, int j);

void change_to_true(int size, bool array[][size], int i, int j)
{
    array[i][j] = true;
}

int main(void)
{
    for (int size = 2; size < 10; size++)
    {
        bool array[size][size];

        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                array[i][j] = false;
                change_to_true(size, array, i, j);
            }
        }
    }
}

请注意,大小必须在函数声明中的数组声明之前。是的,您还使用指向数组表示法的指针编写此代码(实际上,我首先编辑了指向数组表示法代码的指针,然后意识到我想要更简单的版本)。


使用哪个?

除非您有问题中未提及的令人信服的理由,否则第一个版本是要使用的代码。

于 2013-02-03T01:09:06.963 回答
1

这应该有效:

void change_to_true(bool** array, int i, int j)
于 2013-02-03T01:03:32.660 回答
0

应该回答你的问题。

简而言之,您创建一个指向第一个元素的指针,然后传递它。

于 2013-02-03T00:31:46.183 回答
0

[编辑] C 自 C 99 起支持 bool 此外,通过以这种方式声明,实际数组是指向具有所有 size^2 实例的内存区域的指针。这意味着您可以在函数中传递数组来更改它,并在您的标头中声明您正在接收 bool array[][]。这样它应该工作。

于 2013-02-03T01:00:32.740 回答