假設有這麼一種情況:程式中定義了乙個靜態陣列,然後將這個陣列作為引數傳遞給某個函式,如何在該函式中確定陣列長度呢?
int arr=
;f(arr)
;// 如何在函式 f() 中確定 arr 的長度?
c 語言中遇到這種情況,一般是直接將陣列長度作為引數傳遞給f()
:
voidf(
int*arr,
int n)
int arr=
;f(arr,5)
;
如果 arr 是動態陣列,在 c++ 中確實也只能這麼做。但對於靜態陣列就完全沒必要了,因為 arr 中本身就保留了其長度資訊。
c++ 中可以利用模板函式獲取靜態陣列引數長度,具體寫法為:
template
<
typename t, size_t n>
void
f(t (
&vals)
[n])
int arr=
;f(arr)
;// t, n 分別被解析為 int, 5
還可以這麼寫:
template
<
typename t>
void
f(t& arr)
int arr=
;f(arr)
;// t 被解析為 int[5]
這裡std::end(arr) - std::begin(arr)
可以寫成std::size(arr)
(需要 c++17 標準),但不應該寫成sizeof(arr) / sizeof(arr[0])
,因為當輸入陣列長度為0時 (異常情況,c++ 不應當出現長度為0的靜態陣列),其它寫法會在編譯期間報錯,而sizeof
的寫法則不會。
在 stl 標頭檔案range_access.h
可以看到std::size()
的實現:
/**
* @brief return the size of an array.
*/template
<
typename _tp, size_t _nm>
constexpr size_t
size
(const _tp (&)
[_nm]
)noexcept
C 獲取陣列長度
c c 中如何獲取陣列的長度?如何獲取陣列的長度 2010 12 15 20 49 c c 中如何獲取陣列的長度?收藏 c c 中沒有提供 直接獲取陣列長度的函式,對於存放字串的字元陣列提供了乙個strlen函式獲取長度,那麼對於其他型別的陣列如何獲取他們的長度呢?其中一種方法是使 用sizeof ...
C 獲取陣列長度
一 靜態陣列。比如 int int ary 5 靜態陣列在編譯的時候就知道了陣列長度,這對編譯器來說挺好實現的。用得最多的大概就是sizeof了吧 define countof macro x sizeof x sizeof x 0 對於c 可以用模板。如果將陣列作為函式形參的話,它會退化成乙個指標...
C 獲取陣列長度
對於字串陣列,使用strlen 函式來獲取字串陣列的長度。char a1 fwegweasdasdwqew cout strlen a1 endl 例如 int arr 可以用sizeof a sizeof a 0 來獲取陣列的長度。原理 sizeof 函式可以返回陣列所佔的記憶體,而sizeof ...