如何檢測元素是否爲數組?另外,我將如何申報這樣的數組:[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. 測試整數是否爲素數
- 3. 如何測試數組是否至少包含一個元素
- 4. 測試數組是否爲空JUNIT
- 5. 檢查數組是否爲空元素
- 6. 檢查數組元素是否爲鍵
- 7. 檢查數組元素是否爲空
- 8. 測試div是否沒有元素
- 9. 測試元素是否存在jquery
- 10. 如何查看C中數組中的元素是否爲空?
- 11. 測試多個數組元素
- 12. 測試對象是否是Clojure中的Java基元數組
- 13. 單元測試(是或否)
- 14. 測試C宏的值是否爲空
- 15. C++測試雙精度是否爲#INF
- 16. 如何測試Objective-C中的基元是否爲零?
- 17. 檢測參數是否爲Javascript HTML元素數據類型
- 18. 測試numpy數組是否對稱?
- 19. 檢查數組元素是否存在
- 20. 檢查數組是否有空元素
- 21. Python:測試參數是否爲整數
- 22. 確定是否所有元素的數組是素數
- 23. 如何測試函數是否被調用(單元測試角)
- 24. 的jQuery:輸入變量測試是否是DOM元素
- 25. 測試組件元數據
- 26. C++:數組元素設置爲0
- 27. 檢查數組中的元素是否相等 - C++
- 28. C++如何檢查數組中的元素是否相等?
- 29. C++檢查數組中是否存在元素
- 30. 數組是否有一個元素等於元素?