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