我如何检测一个元素是否是一个数组?另外,我将如何声明这样的数组:[1, 2, 3, [4, 5, 6]]
?
最佳答案
你不知道。
在 C 中,多维数组是数组的数组,而不是一个元素是另一个数组而其他元素是数字的数组。 int x[10][10]
将 x
声明为由 10 个 10 个 int
组成的数组,即 10 x 中的总共 100 个元素10矩阵。
要执行您描述的操作,您需要一组 void *
:
struct myarr {
size_t len;
void **arr;
};
您使用 x.arr = malloc(x.len * sizeof(void *))
为 arr
分配 len
元素。然后每个元素可以是任何你想要的 - 也许是一个数字,也许是另一个用于进一步嵌套的 struct myarr
。
但是实际上,您无法知道 void *
是数字还是另一个数组。因此,您需要某种动态类型检查。
enum mytype {
INT,
ARR,
};
然后你创建一个 struct myint
并重做 struct myarr
以兼容:
struct myint {
enum mytype type;
int i;
};
struct myarr {
enum mytype type;
size_t len;
enum mytype **arr;
};
当你制作一个struct myint
时,总是设置x.type = INT
,而当你制作一个struct myarr
时,总是设置x.type = ARR
.
struct
指针总是可以转换为指向第一个元素的指针,因此 struct myint *
和 struct myarr *
都可以转换到 enum mytype *
指针,这是您在 myarr
中的数组所持有的内容。然后,当您使用 .arr[n]
访问数组的元素时,您可以(在运行时)测试它持有什么类型,相应地转换指针,并随意使用:
for(size_t i = 0; i < x.len, i++)
{
enum mytype *j = x.arr[i];
if(*j == INT)
{
printf("%i", ((struct myint *)j)->i);
}
else if(*j == ARR)
{
printf("[");
// recurse
printf("]");
}
else /* this should not happen, you messed up */;
}
有多种其他方法可以从根本上实现相同的目标。
关于c - 测试元素是否为数组 c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5774712/