c++ sizeof,strlen, length
#include <map> #include <iostream> #include <algorithm> #include <functional> #include<forward_list> #include<unordered_map> #include<share.h> using namespace std; int main() { char *str="gdfgjdf;"; char str1[]="vfdvfdbdfb";//补一个‘\0’ char str2[10]="fdgf"; //char str3[4]="fdgfdgf"; char str4[]={'g','f','d'}; cout<<sizeof(*str)<<"***"<<sizeof(str1)<<"***"<<sizeof(str2)<<"***"<<sizeof(str4)<<endl; } *****strlen 和string.length都不算字符串结尾的\0 1/11/10/3 。。。。。。。。。。。。下边的总结的有点乱 #include <map> #include <iostream> #include<string> #include <cstring> using namespace std; int main() { string str="vdfbdffdf"; char *ptr; char ss[100]; cout<<sizeof(str)<<endl;//4 cout<< sizeof(&str)<<endl;//上边那个的别名4 //ptr=str;//false ptr=ss; //ss=str;类型不匹配 // ss=str.c_str();//false //ptr=str.c_str();//const char* !=char * //string--to---char* ,char[] //ptr=str.c_str();//错误 int len=str.length(); ptr=new char[len+1]; strcpy(ptr,str.c_str()); cout<<ptr<<endl; //char arr[]; //cout<<"sizeof:arr[]"<<sizeof(arr);必须赋初值 char arr[100]; cout<<"空arr"<<arr<<endl;//乱码 strcpy(arr,str.c_str()); cout<<arr<<sizeof(arr)<<endl;//vdfbdffdf,100 // char s2[100]={'a','f','w'}; cout<<s2<<"***"<<s2[7]<<endl;//默认后边的初始化为空或者说\0 //// char *pp; char sp[]="fdsfdsg"; pp=sp; char *pp2="dsfsdgfs";//char数组可以直接赋值给指针 //char sp2[]=pp2;//没初始化大小 //char sp2[100]=pp2;//错误:数组用大括号括起来的初始化必须初始化 //***指针不能直接赋值给数组,因为指针只是一个4字节空间变量 char *str1; char *str2="fdsaaaaaaaaaaaafds"; str1=str2; cout<<str2<<endl;//这个表示指针指向相同位置 ///////// char sp2[100]; sp2=str2;//但是这样写就不对,只能说指针指向数组,但是不能数组指向指针 //所以我们只能逐一赋值 int i=0; while(*pp2!='\0') { cout<<*pp2<<"#"; sp2[i++]=*pp2++; } cout<<"exe:"<<sp2<<"____"<<sizeof(sp2)<<endl; ///*******指针所指字符串是\0结尾,但是我们并没有对sp2结尾赋值‘\0'所以sp2输出会有部分乱码。 int *p; *p=10; cout<<p<<*p<<&p<<endl;//0x28...10...ox28.....两个地址不一样 //个人理解:第一个是常量10的地址,第二个是该地址里面的内容。第三个是指针的地址 cout<<sizeof(p)<<sizeof(*p)<<sizeof(&p)<<endl;//4,4,4,地址占4个字节 //下边的没有编译错误,但是不建议这样赋初值 int a; int *lp=&a; *lp=10; cout<<a<<endl;//会导致程序异常不能终止(dos),但是可以编译运行出结果。 } strlen int main() { char *str="gdfgjdf;"; char str1[]="vfdvfdbdfb";//补一个‘\0’ char str2[10]="fdgf"; //char str3[4]="fdgfdgf"; char str4[]={'g','f','d','\0','p'}; cout<<strlen(str); cout<<"***"<<strlen(str1); cout<<"***"<<strlen(str2); cout<<"***"<<strlen(str4)<<endl; } 8,10,4,3 计算占用字符的个数,但是他必须要找到\0 才会停止计算,并且所占字符数量不包括\0 int main() { char *str="gdfgjdf;"; char str1[]="vfdvfdbdfb";//补一个‘\0’ char str2[10]="fdgf"; char str3[40]; char str4[]={'g','f','d','\0','p'}; cout<<strlen(str); cout<<"***"<<strlen(str1); cout<<"***"<<strlen(str2)<<"___"<<sizeof(str2)<<endl; cout<<sizeof(str3)<<endl; cout<<"***"<<strlen(str4)<<"**"<<sizeof(str4)<<endl; } 8,10,4,10,40,3,5 strlen 在计算所占字符个数的时候找到\0,不算\0.,,,,sizeof计算字符指针是4,计算字符数组的时候,没有初始化大小的按照后边字符多少计算比用看\0.若是初始化字符数组大小,比如char s[100];那sizeof(s),就是100; 注意strlen 只能直接计算字符指针,字符数组,不能直接计算字符串,需要c-str(); int main() { string str="fdgdfbfgb"; cout<<strlen(str.c_str());//9 cout<<sizeof(str.c_str());//const char *,4 cout<<sizeof(str)<<endl;//4、、表示指针 cout<<sizeof("dsfdsvf")<<endl;//8 } int main() { char *str="fdfvdsfvbfdb"; char s[]="fdsgdf"; str=s;//虽然可以这样赋值,但是本质上str是一个指针,而s是一段内存,数组名可以代表指针 cout<<sizeof(str)<<sizeof(s)<<endl;//4,7 cout<<strlen(str)<<strlen(s)<<endl;//6,6 } 注意char * 和char []str转string的时候直接赋值是可以的 int main() { char *str="fdfvdsfvbfdb"; char s[]="fdsgdf"; string ss(s); string sss(str); string a=s; string b=str; cout<<ss<<sss; }