最近做了一套軟件公司的筆試題,其中有一題要求給定數組名,求數組的元素個數,當時沒有做出來,後來仔細思考和分析了一番,有了一些新的收獲,分享於此~~
筆試題】:
- 請寫出一個宏,計算數組的元素個數。
- #define countof(arr) ...
- 例如: int a[10], float b[20], char c[100]
- 調用:
- countof(a),返回值為10
- countof(b),返回值為20
- countof(c),返回值為100
答案】: #define countof(arr) sizeof(arr)/sizeof(arr[0])
小問題】:大家知道為什麼試題要求寫一個宏,而不是要求寫一個類似下面的一個函數呢?
int countof(void *arr)
{
}
大家可以測試一下,如果在上面這個函數中實現return sizeof(arr)/sizeof(arr[0]),我們能不能達到最終的期望結果?
---------------------------------------------------------
看下面答案前請大家先思考幾分鐘
---------------------------------------------------------
答案】:不能實現,因為sizeof是在編譯時計算結果,而不支持在運行時計算結果,因此,如果在函數中寫入sizeof(arr),該句子只會返回指針類型所占用的字節數,即4個字節(32位操作系統)。
測試練習】,大家看看下面這段代碼的輸出結果是什麼?
- #include <iostream>
- int getNum(void *pArr)
- {
- return sizeof(pArr);
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- /** 本測試說明:sizeof操作符作用於靜態數組時返回整個數組的全部存儲字節數 */
- int myArr[10];
- std::cout << "sizeof(int): " << sizeof(int) << std::endl;
- std::cout << "myArr : " << sizeof(myArr) << std::endl;
- /** 本測試說明:sizeof操作符不能返回動態分配的數組的字節數 */
- int *pTest = new int(10);
- std::cout << "pTest : " << sizeof(pTest) << std::endl;
- /** 本測試說明:sizeof計算形參得到的結果 —— 指針類型的字節數 */
- int myParam[10];
- char myChar[10];
- std::cout << "getNum(myParam) :" << getNum(myParam) << std::endl;
- std::cout << "getNum(myChar ) :" << getNum(myChar) << std::endl;
- getchar();
- getchar();
- return 0;
- }
結果】:
- sizeof(int): 4
- myArr : 40
- pTest : 4
- getNum(myParam) :4
- getNum(myChar ) :4
附】:
下面是sizeof的MSDN上的解釋。
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.
sizeof關鍵詞給出了存儲傳入的變量或者類型(包括聚合類型)所需要的字節數。該關鍵詞返回size_t類型的變量。
When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof returns the size of the entire array. The sizeof operator cannot return the size of dynamically allocated arrays or external arrays.
當應用到一個結構類型或變量,sizeof返回實際的大小,這可能包括為了字節對齊而填充的字節。當應用於靜態維數組,sizeof返回整個數組的大小。 sizeof運算符不能返回動態分配的數組或外部的數組的大小。
本文出自 “對影成三人” 博客,請務必保留此出處http://ticktick.blog.51cto.com/823160/318727