
c风格字符串
char c[] = {'a','b', 'c', '}';char
[ a]= "abc" ;//默认初始化,s1为空串
注:若未以’\0’结尾的char数组,被当做字符串使用(如在strlen等函数使用),会产生错误,程序会在一直寻找’\0’结尾的字符。
c++风格
string为c++类库的一个类,本质为char数组
string s1; //s2为s1的副本
s2
string ()s1;//等价于
=
string s2 ; s1"abc"
string s3(;)=
string s3 "abc" ;s4
string ('c'n,);//连续n个字符cchar
注:=为拷贝初始化,其余为直接初始化
混用string和c风格字符串:
1.允许使用以空字符结束的字符数组来初始化string对象或为string对象赋值
2.在string对象的加法运算中允许使用以空字符结束的字符数组作为其中一个运算对象(不能两个都是)
3.若程序需要c风格字符串,无法以string代替
* =str //错误 s; const
char * =str . sc_str();= //c_str返回一个c风格的字符串。
即返回一个指向以空字符结尾的字符数组的 指针
cout输出:
string a "abc" ;//"abcd"是一个不变常量,type是const char *
//char* b = (char*)"abcd";
//const char *b = "abcd";
char
* =b "abcd" ;//会报警告 valid in C, invalid in C++ char
[ c]= "abcde" ;<<
cout << a ;endl//abc <<
cout & <<a ; endl//地址 <<
cout & [a0]<< ; endl//abc <<
cout & [a1]<< ; endl//bc <<
cout * &[a0]<< ; endl//a <<
cout << b ; endl//abcd <<
cout * <<b ; endl//a <<
cout * +b 1 << ; endl//98 a的ASCII码是97 <<
cout << c ; endl//abcde <<
cout * <<c ; endl//a char
cout会把char当做c风格字符串处理一直输出到’\0’.
char数组取地址 &a[i] 为char 类型
只有char数组名可以cout输出
其他类型只能输出带*数组名输出数组第一个元素的内容
cout想输出字符串指针本身的值,需要将其转换为void*指针再输出
字符串内存地址
[ str1]= "abc" ;char
[ str2]= "abc" ;const
char [ str3]= "abc" ;const
char [ str4]= "abc" ;const
char * =str5 "abc" ;const
char * =str6 "abc" ;char
* =str7 "abc" ;char
* =str8 "abc" ;=
string s1 "abc" ;=
string s2 "abc" ;=
string s3 string ()s1;=
string s4 string ()s2;<<
cout static_cast <constvoid * (>)str1<<;endl//0x7ffe3f1e20ea <<
cout static_cast <constvoid * (>)str2<<;endl//0x7ffe3f1e20e6 <<
cout static_cast <constvoid * (>)str3<<;endl//0x7ffe3f1e20e2 <<
cout static_cast <constvoid * (>)str4<<;endl//0x7ffe3f1e20de <<
cout static_cast <constvoid * (>)str5<<;endl//0x402005 <<
cout static_cast <constvoid * (>)str6<<;endl//0x402005 <<
cout static_cast <constvoid * (>)str7<<;endl//0x402005 <<
cout static_cast <constvoid * (>)str8<<;endl//0x402005 <<
cout & <<s1 ;endl//0x7ffe3f1e20b0 <<
cout & <<s2 ;endl//0x7ffe3f1e2090 <<
cout & <<s3 ;endl//0x7ffe3f1e2070 <<
cout & <<s4 ;endl//0x7ffe3f1e2050 因此str5,str6,str7,str8指向的是常量,指向的字符串是不可修改的
“abc”是常量,存储在常量区(字符串因为很少修改,在常量区会提高效率)。
char
str1,str2保存在栈区。
(此时有三个“abc",两个在栈,一个常量区
str3,str4保存在栈区
函数中字符串指针的返回
*returnStrPtr ()char{
[ p]= "abc" ;return
; p//返回的是乱码,char数组是局部变量,存储在栈区 }
char
*returnStrPrt ()char{
*= p "abc" ;return
: p//把常量区"abc"的地址返回,字符串常量的内存不会回收 }
char
*returnStrPrt ()static{
char [ p]= "abc" return;
; p//返回静态局部变量的地址,静态数据区不会回收 }
char
char []字符串数组名对应数组的首地址是常量,地址值不可改变,指向的内存的内容可改变
char *字符串数组指针是变量,可指向不同的值,指向的内存的内容有时可变(指向数组首地址),有时不可变(指向字符串常量则不可变)
内存大小
[ str1]= "abc" ;<<
cout sizeof ()str1<< ;endl//4,4个char的数组 char
* =str2 "abc" ;<<
cout sizeof ()str2<< ; endl//8,地址的大小 =
string s1 "abc" ;<<
cout sizeof ()s1<< ; endl//32, string是模板类,无论s有多少,这个类的大小都是32 <<
coutsizeof(.s1c_str())<<;endl//8,c_str返回c风格字符串char* 指针,地址的大小 char
* =str3 "abc" ;=
str3 ; str1<<
cout sizeof ()str3<< ; endl//8, 地址的大小 *
string =s2 new string ("abc");<<
cout sizeof ()s2<< ;endl//8, 地址的大小 <<
cout sizeof (*)s2<< ;endl//32 s2指针指向的是个string类的实例,类的大小为32 <<
cout sizeof ("abc")<< ; endl//4 void
字符串数组名,sizeof()是整个数组所占的内存大小
字符串数组指针,sizeof()是指针的大小,即地址的大小(32位4个字节,64位8个字节)
string类的大小为32
形参
func (char[ p],char * )p1//char[]被当作char*处理,两种写法等价{
}
函数:
strcpy(s1,s2) :复制字符串 s2 到字符串 s1
strcat(s1,s2):连接字符串 s2 到字符串 s1 的末尾
strlen(s1):返回字符串 s1 的长度
strcmp(s1,s2):返回s1与s2的比较结果
strchr(s1,ch):返回一个指针,指向字符串s1中字符ch的第一次出现的位置
strstr(s1,s2):返回一个指针,指向字符串s1中s2的第一次出现的位置
字符串
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)