我有一个 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
我尝试将函数参数的类型定义从bool array
更改为bool* array
,仍然不起作用。
我也尝试了bool (*array_t)[][size] = &array
并bool (*array_t)[size][size] = &array;
指针,仍然不起作用。
此外,由于数组的大小是在运行时决定的,因此我不能以这种方式定义枚举或全局数组。
这应该有效:
void change_to_true(bool** array, int i, int j)
简单的解决方案 — 但没有指向 2D 数组的指针
该函数应简单:
#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,则必须提供 bool
和 true
的定义;其余的不需要更改。 与分配false
相比,我不相信函数调用是值得的。
使用指向 2D 数组的指针的解决方案
请注意,上面的代码严格来说不会创建指向 2D 数组的指针。 如果你真的非常确定这就是你想要的,那么符号就会改变:
#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);
}
}
}
}
请注意,在函数声明中,大小必须位于数组声明之前。 是的,你也用指向数组表示法的指针来编写这个(实际上,我首先编辑了指向数组表示法代码的指针,然后意识到我想要更简单的版本)。
使用哪个?
除非您有问题中未提及的令人信服的理由,否则第一个版本是要使用的代码。
这应该可以回答你的问题。
简而言之,你创建一个指向第一个元素的指针,然后传递它。
[编辑] C 从 C 99 开始支持 bool除此之外,通过以这种方式声明它,实际数组是一个指向具有所有 size^2 实例的内存区域的指针。这意味着您可以在函数中传递数组来更改它,并在标头中声明您正在接收 bool array[][]。这样它应该可以工作。