如何检测元素是否为数组?另外,我将如何申报这样的数组:[1, 2, 3, [4, 5, 6]]
?测试元素是否为数组c
1
A
回答
3
你不知道。
在C中,多维数组是数组的数组,而不是数组,其中一个元素是另一个数组,但其他数组是数字。 int x[10][10]
将x
声明为10个10个阵列的阵列,即10×10个矩阵中的100个全部元素。
做你的描述,你需要的void *
秒的数组:
struct myarr {
size_t len;
void **arr;
};
您分配了arr
len
元素与x.arr = malloc(x.len * sizeof(void *))
。然后每个元素可以是任何你想要的 - 可能是一个数字,也许是另一个嵌套的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 */;
}
还有其他各种方式实现根本一样的东西。
2
C中的数组绝对不能这么做 - 它们不能容纳并非所有类型的对象集合。 C++标准库中的集合类也是如此。要创建这种“异构”集合,实际上需要定义某种结构(或C++中的类) - 例如称为DataObject
- 然后安排DataObject
能够表示不同的类型,通常使用union
。然后阵列中的所有东西都可以是DataObject
,但其中一些可以是DataObject
,其中包含int
,其他可以包含另一个DataObject
阵列。
相关问题
- 1. 测试对象是否为DOM元素
- 2. PHP测试日期是否是数组的第一个元素
- 3. 测试整数是否为素数
- 4. jQuery:测试元素是否为MATCHED元素的第一个
- 5. 单元测试(Python),测试函数是否返回数组
- 6. 如何测试数组是否至少包含一个元素
- 7. 测试数组是否为空JUNIT
- 8. 测试发送值是否为数组
- 9. 检查数组是否为空元素
- 10. 检查数组元素是否为键
- 11. 检查数组元素是否为空
- 12. 测试是否元素存在
- 13. 测试元素是否存在jquery
- 14. 测试div是否没有元素
- 15. 测试某些元素是否可见
- 16. 如何查看C中数组中的元素是否为空?
- 17. 测试多个数组元素
- 18. javascript:测试如果this.name ==数组元素
- 19. 测试python列表中的所有元素是否为False
- 20. javascript + e4x:如何测试元素是否为空?
- 21. 测试对象是否是Clojure中的Java基元数组
- 22. 尝试查找int数组的元素是否等于输入的数字C
- 23. 单元测试(是或否)
- 24. C++测试双精度是否为#INF
- 25. 测试C宏的值是否为空
- 26. 如何测试一对元素是否在数据框中?
- 27. 我如何测试元素是否在json数据中
- 28. 如何测试是否在numpy的数组每一个元素都被屏蔽
- 29. C#,如何判断数组的第一个元素是否为null,何时数组可能没有元素?
- 30. 只获取匹配测试数组所有元素的数组元素?