目錄
一、 數組或字符串的長度
1、sizeof()---求所佔的字節數
(1)、對於整型字符型數組
int A[]={1,4,5,2,8,6,0};
//求整型數組A所佔的字節數
int i=sizeof(A); //i表示整型數組A所佔的總空間的字節數
cout<<” i=sizeof(A)= ”<<i<<endl;
i=sizeof(A)/sizeof(int); //此時i表示數字數組的元素個數
char B[]={‘a’,’e’,’s’,’r’,’q’};
//求字符數組的所佔的字節數
cout<<i<<endl; //結果爲5*sizeof(char)=5
//求字符數組的元素個數
i=szieof(B)/sizeof(char); //結果爲5
i=sizeof(C); //i爲字符數組C所佔的字節空間,爲6,最後一個爲’\0’
cout<<i<<endl;
(2)、對於整型或字符型指針
p=A;
int i=sizeof(*p); //此時i就是p所指的整型數組A的第一個元素A[0]的所佔字節數
cout<<i<<endl;
i=sizeof(P); // p爲整形指針,大小爲定值爲4
cout<<*p<<endl; //輸出A[0]即1
cout<<p<<endl; //輸出的結果爲整型指針所指向的地址 0x……
char *p;
char B[]={‘a’,’s’,’e’,’r’};
p=B; //字符指針賦值,或char
*p=B;這樣爲字符指針初始化賦值
i=sizeof(p); //p爲字符指針,指針的大小爲定值,爲4
cout<<i<<endl;
i=sizeof(*p); //這是指B[0]所佔空間的大小
cout<<i<<endl; //結果爲1
注意:
cout<<*p<<endl; //輸出結果爲字符a
cout<<p<<endl;
cout<<hex<<(int)&(*p)<<" "<<&B<<endl; //輸出結果兩者相同
cout<<hex<<(int)p<<" "<<&B<<endl; //輸出結果兩者相同
2、strlen()---字符數組或字符串所佔的字節數
strlen所作的僅僅是一個計數器的工作,它從內存的某個位置(可以是字符串開頭,中間某個位置,甚至是某個不確定的內存區域)開始掃描,直到碰到第一個字符串結束符'\0'爲止,然後返回計數器值。
--就是指實際字符串或字符數組的實際長度(不是所佔空間的字節數)。
(1)、針對字符數組
char A[6]={'a','b','\0','d','e','r'};
int i=strlen(A); //i爲2,因爲到’\0’結束,故實際A[]只有2個元素
cout<<i<<endl;
char *str="abcde";
i=strlen(str); //i爲5
cout<<i<<endl;
//char A[6]={"abcdef"}; //error C2117: 'abcdef' : array bounds overflow
(2)、針對字符指針
char C[]={"abcdef"};
char *p1=C;
i=strlen(p1); //結果爲6
cout<<i<<endl;
char D[]={'a','c','q','f','w'};
i=strlen(D); //這樣,由於沒指定D的內存分配大小,用strlen求其長度會造成錯誤。
//如果爲char D[5]={'a','c','q','f','w'};這樣再用strlen求其長度也會造成錯誤,當D[]之中的數
//大於5纔不會造成錯誤。
cout<<i<<endl;
(3)、針對其他結構
class X
{
int i;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; 結果 12
===》內存補齊
cout<<sizeof(x)<<endl; 結果 12 同上
解釋一下,在class
X中,成員中最大的所佔的空間爲int類型所佔的空間4個字節,故內存補齊,最後結果爲:
((int)(實際成員所佔內存空間的和/4)+1)*4
(4)、有關空類
一個空類佔多少空間?多重繼承呢?
可以自己編寫一個程序簡單測一下:
#include <iostream>
using namespace std;
class A
{
};
class A2
{
};
class B:public A
{
};
class C:public virture B
{
};
class D:public A,public A2
{
};
int main()
{
cout<<"sizeof(A): "<<sizoef(A)<<endl;
cout<<"sizeof(B): "<<sizeof(B)<<endl;
cout<<"sizeof(C): "<<sizeof(C)<<endl;
cout<<"sizeof(D): "<<sizeof(D)<<endl;
return 0;
}
結果:1 1 4 1
表明空類所佔空間爲1個字節,單一繼承的空類空間也爲1,多重繼承的空類空間還是1,但虛繼承涉及虛表(虛指針),所以sizeof(C)爲 4。
3、sizeof()與strlen()區別
sizeof()返回的是變量聲明後所佔的內存數,不是實際長度,此外sizeof不是函數,僅僅是一個操作符,strlen是函數。
4、c++中的字符串string的長度
string str1=”xxxxx”;
int i=str1.length();
cout<<”i=str1.length()= ”<<i<<endl; //結果爲5,因爲5個x
i=tr1.size();
cout<<”str1.size()= ”<<i<<endl;
對於c++中的size()和lengt()沒有區別,下面是它們的代碼
size_type __CLR_OR_THIS_CALL length() const
{ // return length of sequence
return (_Mysize);
}
size_type __CLR_OR_THIS_CALL size() const
{ // return length of sequence
return (_Mysize);
}
爲了兼容等,這兩個函數一樣。
length是因爲沿用C語言的習慣而保留下來的,string類最初只有length,引入STL之後,爲了兼容又加入了size,它是作爲STL容器的屬性存在的,便於符合STL的接口規則,以便用於STL的算法。
string類的size()/length()方法返回的是字節數,不管是否有漢字。