为什么我的数组作为一维数组传递
Why is my array getting passed as a 1d array
尽管当我查看我的调试器时,同样的东西输出了两次,“array”是一个二维数组,而“arrayA”是一个一维数组。如何将“数组”作为二维数组传递给函数?
#include <stdio.h>
#include <string.h>
#include <cs50.h>
void testCase (bool lockear[9][9]);
bool array[9][9];
int main(void)
{
for(int i = 0; i > 3; i++)
{
for(int j = 0; j > 3; j++)
{
array[i][j] = true;
}
}
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
printf("%s ",array[i][j]?"true":"false");
}
printf("\n");
}
printf("\n\n");
testCase(array);
}
void testCase (bool arrayA[9][9])
{
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
printf("%s ",arrayA[i][j]?"true":"false");
}
printf("\n");
}
}
(查看下面的注释,了解您的代码中的一些错误)
数组不传递给函数。数组通过引用作为参数传递,因此它们不会更改其形态以传递给函数。由于数组不能按值传递,编译器安排传递引用,但作为引用,它是一个指针,据说它们在参数声明时退化为指针(尽管你将它们声明为一个数组),这意味着如果你有一个基类型 T
,你有一个数组(例如 T[9][9]
),则数组的基元素类型是 T elem[9]
( this is the base type of the whole array is itself an array of 9 T
elements), and it as passed as a pointer (indeed as this thing: T (*array_ref)[9]
) to the array.
在你的情况下你有 bool array[9][9]
,当你声明它时参数的类型是 bool array[9][9]
,但衰减使它实际上是 bool (*array)[9]
。这可以通过他们的 sizeof
操作员应用程序轻松测试,使用以下简单程序显示:
#include <stdio.h>
#include <stdbool.h>
/* the next macro prints a variable name and its sizeof */
#define P(_var) printf("sizeof "#_var" is %zd\n", sizeof _var)
void f(bool a[9][9])
{
printf("in f()\n");
P(a); /* this will generate a warning because of the
* decay to pointer and will print the pointer
* size, instead, revealing the decay to pointer,
* besides the declaration of it as an array. */
P(a[0]);
P(a[0][0]);
}
int main()
{
bool array[9][9]; /* this affects only parameters, not local variables */
printf("in main()\n");
P(array); /* this will show the true array sizeof */
P(array[0]);
P(array[0][0]);
f(array);
}
这将输出(您的系统可以显示不同的数字,因为根据体系结构,指针可以是 4 或 8 个字节长):
$ test_case
in main()
sizeof array is 81 <-- 9 x 9 bytes == 81
sizeof array[0] is 9 <-- 9 booleans == 9
sizeof array[0][0] is 1 <-- 1 boolean == 1
in f()
sizeof a is 8 <-- pointer size == 8
sizeof a[0] is 9 <-- 9 booleans == 9
sizeof a[0][0] is 1 <-- 1 boolean == 1
$ _
顺便说一句,二维数组是一个接一个地构建一个元素以形成一行....然后在前一行之后追加一行,直到您拥有完整的数组。因此很容易将它们与线性数组混淆,因为有关行结束位置和另一行开始位置的信息在转换为机器语言的过程中丢失了。你可以看到(但不鼓励)它作为一个数组的数组或一个接一个地包含 81 个元素的数组。
备注
请注意您的代码中有一些拼写错误(或错误),例如第一个循环中的测试说 while i > 3
并且应该是 i < 3
(i
被初始化为 0
,所以循环永远不会被执行)。我没有进一步检查您的代码,但您应该在发布之前对其进行测试。内循环也有同样的问题。
注2
程序可能会向您发出警告,通知您指针衰减,并且 sizeof
运算符不会为您提供数组大小,而是指针大小。这是预期的(我们试图说明衰减)并且可以通过使用以下选项编译来避免:-Wno-sizeof-array-argument
,但您可以忽略此警告(FreeBSD clang 版本 12.0.1)。
尽管当我查看我的调试器时,同样的东西输出了两次,“array”是一个二维数组,而“arrayA”是一个一维数组。如何将“数组”作为二维数组传递给函数?
#include <stdio.h>
#include <string.h>
#include <cs50.h>
void testCase (bool lockear[9][9]);
bool array[9][9];
int main(void)
{
for(int i = 0; i > 3; i++)
{
for(int j = 0; j > 3; j++)
{
array[i][j] = true;
}
}
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
printf("%s ",array[i][j]?"true":"false");
}
printf("\n");
}
printf("\n\n");
testCase(array);
}
void testCase (bool arrayA[9][9])
{
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
printf("%s ",arrayA[i][j]?"true":"false");
}
printf("\n");
}
}
(查看下面的注释,了解您的代码中的一些错误)
数组不传递给函数。数组通过引用作为参数传递,因此它们不会更改其形态以传递给函数。由于数组不能按值传递,编译器安排传递引用,但作为引用,它是一个指针,据说它们在参数声明时退化为指针(尽管你将它们声明为一个数组),这意味着如果你有一个基类型 T
,你有一个数组(例如 T[9][9]
),则数组的基元素类型是 T elem[9]
( this is the base type of the whole array is itself an array of 9 T
elements), and it as passed as a pointer (indeed as this thing: T (*array_ref)[9]
) to the array.
在你的情况下你有 bool array[9][9]
,当你声明它时参数的类型是 bool array[9][9]
,但衰减使它实际上是 bool (*array)[9]
。这可以通过他们的 sizeof
操作员应用程序轻松测试,使用以下简单程序显示:
#include <stdio.h>
#include <stdbool.h>
/* the next macro prints a variable name and its sizeof */
#define P(_var) printf("sizeof "#_var" is %zd\n", sizeof _var)
void f(bool a[9][9])
{
printf("in f()\n");
P(a); /* this will generate a warning because of the
* decay to pointer and will print the pointer
* size, instead, revealing the decay to pointer,
* besides the declaration of it as an array. */
P(a[0]);
P(a[0][0]);
}
int main()
{
bool array[9][9]; /* this affects only parameters, not local variables */
printf("in main()\n");
P(array); /* this will show the true array sizeof */
P(array[0]);
P(array[0][0]);
f(array);
}
这将输出(您的系统可以显示不同的数字,因为根据体系结构,指针可以是 4 或 8 个字节长):
$ test_case
in main()
sizeof array is 81 <-- 9 x 9 bytes == 81
sizeof array[0] is 9 <-- 9 booleans == 9
sizeof array[0][0] is 1 <-- 1 boolean == 1
in f()
sizeof a is 8 <-- pointer size == 8
sizeof a[0] is 9 <-- 9 booleans == 9
sizeof a[0][0] is 1 <-- 1 boolean == 1
$ _
顺便说一句,二维数组是一个接一个地构建一个元素以形成一行....然后在前一行之后追加一行,直到您拥有完整的数组。因此很容易将它们与线性数组混淆,因为有关行结束位置和另一行开始位置的信息在转换为机器语言的过程中丢失了。你可以看到(但不鼓励)它作为一个数组的数组或一个接一个地包含 81 个元素的数组。
备注
请注意您的代码中有一些拼写错误(或错误),例如第一个循环中的测试说 while i > 3
并且应该是 i < 3
(i
被初始化为 0
,所以循环永远不会被执行)。我没有进一步检查您的代码,但您应该在发布之前对其进行测试。内循环也有同样的问题。
注2
程序可能会向您发出警告,通知您指针衰减,并且 sizeof
运算符不会为您提供数组大小,而是指针大小。这是预期的(我们试图说明衰减)并且可以通过使用以下选项编译来避免:-Wno-sizeof-array-argument
,但您可以忽略此警告(FreeBSD clang 版本 12.0.1)。