c风格字符串
char c[] = {'a','b', 'c', '\0'};
char a[] = "abc";
注:若未以’\0’结尾的char数组,被当做字符串使用(如在strlen等函数使用),会产生错误,程序会在一直寻找’\0’结尾的字符。
c++风格
string为c++类库的一个类,本质为char数组
string s1; //默认初始化,s1为空串
//s2为s1的副本
string s2(s1);
//等价于
string s2 = s1;
string s3("abc");
string s3 = "abc";
string s4(n,'c');//连续n个字符c
注:=为拷贝初始化,其余为直接初始化
混用string和c风格字符串:
1.允许使用以空字符结束的字符数组来初始化string对象或为string对象赋值
2.在string对象的加法运算中允许使用以空字符结束的字符数组作为其中一个运算对象(不能两个都是)
3.若程序需要c风格字符串,无法以string代替
char *str = s; //错误
const char *str = s.c_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 << &a[0] << endl; //abc
cout << &a[1] << endl; //bc
cout << *&a[0] << 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
cout会把char当做c风格字符串处理一直输出到’\0’.
char数组取地址 &a[i] 为char 类型
只有char数组名可以cout输出
其他类型只能输出带*数组名输出数组第一个元素的内容
cout想输出字符串指针本身的值,需要将其转换为void*指针再输出
字符串内存地址
char 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<const void *>(str1)<<endl; //0x7ffe3f1e20ea
cout << static_cast<const void *>(str2)<<endl; //0x7ffe3f1e20e6
cout << static_cast<const void *>(str3)<<endl; //0x7ffe3f1e20e2
cout << static_cast<const void *>(str4)<<endl; //0x7ffe3f1e20de
cout << static_cast<const void *>(str5)<<endl; //0x402005
cout << static_cast<const void *>(str6)<<endl; //0x402005
cout << static_cast<const void *>(str7)<<endl; //0x402005
cout << static_cast<const void *>(str8)<<endl; //0x402005
cout << &s1 <<endl; //0x7ffe3f1e20b0
cout << &s2 <<endl; //0x7ffe3f1e2090
cout << &s3 <<endl; //0x7ffe3f1e2070
cout << &s4 <<endl; //0x7ffe3f1e2050
“abc”是常量,存储在常量区(字符串因为很少修改,在常量区会提高效率)。因此str5,str6,str7,str8指向的是常量,指向的字符串是不可修改的
str1,str2保存在栈区。(此时有三个“abc",两个在栈,一个常量区
str3,str4保存在栈区
函数中字符串指针的返回
char* 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
cout<<sizeof(s1.c_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
字符串数组名,sizeof()是整个数组所占的内存大小
字符串数组指针,sizeof()是指针的大小,即地址的大小(32位4个字节,64位8个字节)
string类的大小为32
形参
void 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的第一次出现的位置
5245

被折叠的 条评论
为什么被折叠?



