天天看點

C++基礎(十五)sizeof的用法 計算數組長度

sizeof本身是C語言的一個運算符,但也被C++支援,且很多C++代碼中經常會出現。

sizeof可以很容易計算一個數組的長度,這在數組作為參數的函數中很有用(數組作為函數參數,傳入的其實是首元素的位址,必須帶上數組的實際長度作為另一個參數才行)。

請看下面代碼(visual stadio 2019環境編譯,unicode字元集,x64程式):

#include <iostream>
int main()
{
	using namespace std;

	int iValue = 10;
	cout << "int:" << sizeof(iValue) << endl;
	
	int array_int[] = { 1, 2, 3 };
	cout << "array_int:" << sizeof(array_int) << endl;

	char chChar = 'a';
	cout << "char:" << sizeof(chChar) << endl;
	char array_char[] = { 'a', '是', 'c' };
	cout << "array_char:" << sizeof(array_char) << endl;

	wchar_t wcChar = L'a';
	cout << "wchar:" << sizeof(wcChar) << endl;
	wchar_t array_wchar[] = { L'a', L'是', L'c' };
	cout << "array_wchar_t:" << sizeof(array_wchar) << endl;

	const char* pEnglish = "hello";
	cout << "char*_en:" << sizeof(pEnglish) << endl;

	const char* pChinese = "中文";
	cout << "char*_zh:" << sizeof(pChinese) << endl;

	int* pInt = new int(10);
	cout << "int*:" << sizeof(pInt) << endl;

	system("pause");
	return 0;
}
           

首先,編譯時便會有一下警告:

C++基礎(十五)sizeof的用法 計算數組長度

問題出在這一句:char array_char[] = { 'a', '是', 'c' };

為何會有警告?這裡涉及到另一個編碼問題,此處先不說,後面有機會再寫一篇文章說明。

執行結果如下:

C++基礎(十五)sizeof的用法 計算數組長度

是否有些意外?逐行解釋:

sizeof(iValue)輸出4很簡單,一個int占4個位元組,都會背了。

 sizeof(array_int)輸出12,說明sizeof的參數如果是數組,則會輸出數組中所有元素的總位元組數。3個int元素,每個int4個位元組,一共12個位元組,很好了解。

後面的char和array_char也證明了這一點,一個char占一個位元組,array_char裡有3個元素,每個占1個位元組,這個數組中加起來就是3個位元組。

wchar_t是寬位元組,其對應的所有字元都是兩個占2個位元組。是以sizeof(array_wchar)就會輸出3*2=6。

sizeof(pEnglish)為何會輸出8呢?這是因為sizeof的參數若不是數組,隻是計算其對應變量的位元組數。這行代碼輸出的其實是pEnglish這個變量的位元組數,而不是它所指向的字元串。pEnglish是什麼?是個指針。在64位程式中,不管什麼類型的指針,都是占8個位元組;而在32位程式中,指針占4個位元組。

sizeof(pChinese)中pChinese所指向是一個中文字元串,但是pChinese本身也是一個char類型的指針,是以會輸出8。

sizeof(pInt),pInt也是一個指針,是以輸出的還是8(這裡沒有delete pInt,實際程式中一定不能忘了)。

總結起來兩點:

1、sizeof的參數如果是數組,則輸出數組中所有元素的位元組總數;

2、sizeof的參數如果不是數組,則輸出參數本身所占的位元組數。

根據上面所講第一點,很容易計算出數組中元素的個數:數組中所有元素的總位元組數/數組元素類型的位元組數。

例如上面的array_int,則隻需要:sizeof(array_int)/sizeof(int);array_wchar,則隻需要sizeof(array_wchar)/sizeof(wchar_t)即可。

另外,上面說到,在32位程式中,指針變量本身占4個位元組,以上程式,在vs的配置管理器中将程式改成x86的即可驗證。

C++基礎(十五)sizeof的用法 計算數組長度

運作結果如下:

C++基礎(十五)sizeof的用法 計算數組長度

可以看到,後面四個指針變量的sizeof都是4。

除了這些,我們還經常聽到“一個英文字元占1個位元組,一個中文字元占2個位元組”,又是什麼意思呢?在另一篇文章中會有介紹。

繼續閱讀