使用引用的情況和指針相似
1 int Sum(int (&i))
2 {
3 int sumofi = 0;
4 for (int j = 0; j < sizeof(i)/sizeof(int); j++)
5 {
6 sumofi += i[j];
7 }
8 return sumofi;
9 }
10
11 int main()
12 {
13 int allAges[] = {21, 22, 22, 19, 34, 12};
14 cout《Sum(allAges)《endl;
15 system("pause");
16 return 0;
17 }
18
這種情況下sizeof的計(jì)算同樣無(wú)意義,所以用數(shù)組做參數(shù),而且需要遍歷的時(shí)候,函數(shù)應(yīng)該有一個(gè)參數(shù)來(lái)說(shuō)明數(shù)組的大小,而數(shù)組的大小在數(shù)組定義的作用域內(nèi)通過(guò)sizeof求值。因此上面的函數(shù)正確形式應(yīng)該是
1 #include
2 using namespace std;
3
4 int Sum(int *i, unsigned int n)
5 {
6 int sumofi = 0;
7 for (int j = 0; j < n; j++)
8 {
9 sumofi += i[j];
10 }
11 return sumofi;
12 }
13
14 int main()
15 {
16 int allAges[] = {21, 22, 22, 19, 34, 12};
17 cout《Sum(i, sizeof(allAges)/sizeof(int))《endl;
18 system("pause");
19 return 0;
20 }
(7)、C風(fēng)格字符串與C++風(fēng)格字符串類(lèi)(String)的sizeof和strlen
考慮下面的問(wèn)題
1 #include
2 using namespace std;
3
4 char a[] = "abcdef";
5 char b[20] = "abcdef";
6 string s = "abcdef";
7
8 cout《strlen(a)《endl; // 6,字符串長(zhǎng)度9 cout《sizeof(a)《endl; // 7,字符串容量10 cout《strlen(b)《endl; // 6,字符串長(zhǎng)度11 cout《sizeof(b)《endl; // 20,字符串容量12 //cout《strlen(s)《endl; // 錯(cuò)誤!s不是一個(gè)字符指針。
13 cout《sizeof(s)《endl; // 16, 這里不代表字符串的長(zhǎng)度,而是string類(lèi)的大小
14
15 a[1] = '"0';
16 cout《strlen(a)《endl; // 1
17 cout《sizeof(a)《endl; // 7,sizeof是恒定的,因?yàn)槭乔懊嬉呀?jīng)固定分配過(guò)7個(gè)單元,雖然現(xiàn)在字符串變?yōu)榭沾?/P>
18
記。篠tring是class類(lèi)型。(關(guān)于class類(lèi)型的sizeof請(qǐng)參見(jiàn)第五節(jié))
strlen是尋找從指定地址開(kāi)始,到出現(xiàn)的第一個(gè)0之間的字符個(gè)數(shù),他是在運(yùn)行階段執(zhí)行的,而sizeof是得到數(shù)據(jù)的大小,在這里是得到字符串的容量。所以對(duì)同一個(gè)對(duì)象而言,sizeof的值是恒定的。string是C++類(lèi)型的字符串,他是一個(gè)類(lèi),所以sizeof(s)表示的并不是字符串的長(zhǎng)度,而是類(lèi)string的大小。strlen(s)根本就是錯(cuò)誤的,因?yàn)閟trlen的參數(shù)是一個(gè)字符指針,如果想用strlen得到s字符串的長(zhǎng)度,應(yīng)該使用sizeof(s.c_str()),因?yàn)閟tring的成員函數(shù)c_str()返回的是字符串的首地址。實(shí)際上,string類(lèi)提供了自己的成員函數(shù)來(lái)得到字符串的容量和長(zhǎng)度,分別是Capacity()和Length()。string封裝了常用了字符串操作,所以在C++開(kāi)發(fā)過(guò)程中,最好使用string代替C類(lèi)型的字符串。
STL中的String類(lèi)
string的sizeof和平臺(tái)相關(guān)的,string類(lèi)最簡(jiǎn)單的可以近似認(rèn)為是包含兩個(gè)數(shù)據(jù)成員:char *指針成員( 表示字符數(shù)組)和 int成員(表示字符串長(zhǎng)度)。但是事實(shí)上并不是這樣定義的,可能還有其他數(shù)據(jù)成員,如編譯器插入指針vptr等。因此根據(jù)不同的實(shí)現(xiàn),可以查看String類(lèi)的定義中如何定義。比如在我現(xiàn)在機(jī)器上,sizeof(string) = 16。
相關(guān)推薦:
2012年下半年計(jì)算機(jī)等級(jí)考試報(bào)名時(shí)間及入口匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |