使用引用的情況和指針相似
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的計算同樣無意義,所以用數組做參數,而且需要遍歷的時候,函數應該有一個參數來說明數組的大小,而數組的大小在數組定義的作用域內通過sizeof求值。因此上面的函數正確形式應該是
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風格字符串與C++風格字符串類(String)的sizeof和strlen
考慮下面的問題
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,字符串長度9 cout《sizeof(a)《endl; // 7,字符串容量10 cout《strlen(b)《endl; // 6,字符串長度11 cout《sizeof(b)《endl; // 20,字符串容量12 //cout《strlen(s)《endl; // 錯誤!s不是一個字符指針。
13 cout《sizeof(s)《endl; // 16, 這里不代表字符串的長度,而是string類的大小
14
15 a[1] = '"0';
16 cout《strlen(a)《endl; // 1
17 cout《sizeof(a)《endl; // 7,sizeof是恒定的,因為是前面已經固定分配過7個單元,雖然現在字符串變?yōu)榭沾?/P>
18
記�。篠tring是class類型。(關于class類型的sizeof請參見第五節(jié))
strlen是尋找從指定地址開始,到出現的第一個0之間的字符個數,他是在運行階段執(zhí)行的,而sizeof是得到數據的大小,在這里是得到字符串的容量。所以對同一個對象而言,sizeof的值是恒定的。string是C++類型的字符串,他是一個類,所以sizeof(s)表示的并不是字符串的長度,而是類string的大小。strlen(s)根本就是錯誤的,因為strlen的參數是一個字符指針,如果想用strlen得到s字符串的長度,應該使用sizeof(s.c_str()),因為string的成員函數c_str()返回的是字符串的首地址。實際上,string類提供了自己的成員函數來得到字符串的容量和長度,分別是Capacity()和Length()。string封裝了常用了字符串操作,所以在C++開發(fā)過程中,最好使用string代替C類型的字符串。
STL中的String類
string的sizeof和平臺相關的,string類最簡單的可以近似認為是包含兩個數據成員:char *指針成員( 表示字符數組)和 int成員(表示字符串長度)。但是事實上并不是這樣定義的,可能還有其他數據成員,如編譯器插入指針vptr等。因此根據不同的實現,可以查看String類的定義中如何定義。比如在我現在機器上,sizeof(string) = 16。
相關推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |