1. 與strlen()比較 strlen計算字符數(shù)組的字符數(shù),以“\0"為結(jié)束符,不計算“\0"為數(shù)組元素。 sizeof()計算數(shù)據(jù)(數(shù)組、變量、類型、結(jié)構(gòu)體等)所占空間,用字節(jié)數(shù)表示。 2.指針與靜態(tài)數(shù)組的sizeof操作 指針均可看為變量類型的一種,所有指針變量的sizeof操作結(jié)果均為4 。(這個已實踐證明) 所以不要用下面的方式去計算一個字符數(shù)組的長度: char *a= "nihaomao"; int count = sizeof(a);//返回值為4 而應(yīng)該使用下面的方式計算: char a[] = "nihaomao"; int count = sizeof(a);返回值為1*8=8 int a[10]; sizeof(a)則返回值為4*10=40 。 PS:數(shù)組做形參時,數(shù)組名稱被當(dāng)做指針使用。例如:(已驗證) void fun(char p[]) { sizeof(p); //返回值為4 } 經(jīng)典問題: double* (*a)[3][6]; cout<<sizeof(a)<<endl; // 4 a為指針 cout<<sizeof(*a)<<endl; // 72 *a為一個有3*6個指針元素的數(shù)組 cout<<sizeof(**a)<<endl; // 24 **a為數(shù)組一維的6個指針 cout<<sizeof(***a)<<endl; // 4 ***a為一維的第一個指針 cout<<sizeof(****a)<<endl; // 8 ****a為一個double變量 問題解析:a是一個很奇怪的定義,他表示一個指向double*[3][6]類型數(shù)組的指針。既然是指針,所以sizeof(a)就是4。 既然a是執(zhí)行double*[3][6]類型的指針,*a就表示一個double*[3][6]的多維數(shù)組類型,因此sizeof(*a)=3*6*sizeof(double*)=72。同樣的,**a表示一個double*[6]類型的數(shù)組,所以sizeof(**a)=6*sizeof (double*)=24。***a就表示其中的一個元素,也就是double*了,所以sizeof(***a)=4。至于****a,就是一個double了,所以sizeof(****a)=sizeof(double)=8。 3.格式的寫法 sizeof操作符,對變量或?qū)ο罂梢圆患永ㄌ枺羰穷愋?,須加括號?br> 4.使用sizeof時string的注意事項 string s="hello"; sizeof(s)等于string類的大小,sizeof(s.c_str())得到的是與字符串長度。 5.union 與struct的空間計算 總體上遵循兩個原則: (1)整體空間是 占用空間最大的成員(的類型)所占字節(jié)數(shù)的整倍數(shù) (2)數(shù)據(jù)對齊原則----內(nèi)存按結(jié)構(gòu)成員的先后順序排列,當(dāng)排到該成員變量時,其前面已擺放的空間大小必須是該成員類型大小的整倍數(shù),如果不夠則補齊,以此向后類推。。。。。 注意:數(shù)組按照單個變量一個一個的擺放,而不是看成整體。如果成員中有自定義的類、結(jié)構(gòu)體,也要注意數(shù)組問題。 |
|