數組與字符串長度sizeof()、strlen()、string的length()和size()

目錄

一、 數組或字符串的長度

1、sizeof()---求所佔的字節數

1)、對於整型字符型數組

2)、對於整型或字符型指針

2、strlen()---字符數組或字符串所佔的字節數

1)、針對字符數組

2)、針對字符指針

3、sizeof()與strlen()區別

4c++中的字符串string的長度

 

 

一、   數組或字符串的長度

1sizeof()---求所佔的字節數

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’};

//求字符數組的所佔的字節數

i=sizeof(B);          

cout<<i<<endl;                   //結果爲5*sizeof(char)=5

//求字符數組的元素個數

i=szieof(B)/sizeof(char);           //結果爲5

 

char C[]=”abcde”;

i=sizeof(C);       //i爲字符數組C所佔的字節空間,爲6,最後一個爲’\0’

cout<<i<<endl;

 

2)、對於整型或字符型指針

         int *p;

         int A[]={1,2,3,4,5,6,7,8};

         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;           //輸出結果兩者相同 
  
 

2strlen()---字符數組或字符串所佔的字節數


strlen所作的僅僅是一個計數器的工作,它從內存的某個位置(可以是字符串開頭,中間某個位置,甚至是某個不確定的內存區域)開始掃描,直到碰到第一個字符串結束符'\0'爲止,然後返回計數器值。 
--就是指實際字符串或字符數組的實際長度(不是所佔空間的字節數)。

1)、針對字符數組


         char A[6]={'a','b','\0','d','e','r'}; 
int i=strlen(A);          //i2,因爲到’\0’結束,故實際A[]只有2個元素 
cout<<i<<endl; 
char *str="abcde"; 
 i=strlen(str);           //i5 
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。

 

3sizeof()strlen()區別


sizeof()返回的是變量聲明後所佔的內存數,不是實際長度,此外sizeof不是函數,僅僅是一個操作符,strlen是函數。 
 

4c++中的字符串string的長度


string str1=”xxxxx”; 
int i=str1.length(); 
cout<<”i=str1.length()= ”<<i<<endl; //結果爲5,因爲5x 
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()方法返回的是字節數,不管是否有漢字。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章