c++中关于char
在c++中,字符串可以通过两种形式表示:传统字符串和字符数组。 1. 传统字符串 a) char ch1[] = {“liangdiamond”} b) char ch2[] = {“hello world”} 其中关于传统字符串,有几个常用的函数 a) strcpy()函数 b) strcat()函数 c) strlen()函数 d) strcmp()函数 e) strlwr()函数:大写变为小写 f) strupr()函数,小写变为大写 2. 字符数组 从表面上看,一个字符串是一个字符数组,但在c++语言中,它们不同。字符串是以’\0’结束的字符型数组。 下面这段代码展示字符串和字符数组的区别: #include <iostream> using namespace std; int main() { char a[] = {"hello"}; char b[] = {'h','e','l','l','o'}; int la = 0; int lb = 0; cout<<"The length of a[]:"<<sizeof(a)/sizeof(char)<<endl; cout<<"The length of b[]:"<<sizeof(b)/sizeof(char)<<endl; system("Pause"); return 0; } 可以修改程序: #include <iostream> using namespace std; int main() { char a[] = {"hello"}; char b[] = {'h','e','l','l','o','\0'}; int la = 0; int lb = 0; cout<<"b="<<b<<endl; cout<<"The length of a[]:"<<sizeof(a)/sizeof(char)<<endl; cout<<"The length of b[]:"<<sizeof(b)/sizeof(char)<<endl; system("Pause"); return 0; } 但是数组名就是数组的首地址,所以数组名本身就可以理解为一个指针,只不过,它是指针常量,所谓指针常量,就是指针不能改变所指向的地址了,但是它所指向的地址中的值可以改变。 例如: #include <iostream> using namespace std; int main() { char a[] = {"hello"}; char b[] = {'h','e','l','l','o','\0'}; a++; system("Pause"); return 0; } 编译报错。 字符数组和字符指针虽然在形式上很接近,但在内存空间的分配和使用上还是有很大差别。数组名不是一个运行时的实体,因此数组本身是有空间的,这个空间由编译器负责分配。而指针是一个变量(运行时实体),它所指向的空间是否合法要在运行时决定。 #include <iostream> using namespace std; int main() { char s[] = "abc"; char* p = "abc"; s[0] = 'x'; cout<<s<<endl; //p[0] = 'x'; 编译报错 cout<<p<<endl; system("Pause"); return 0; } 调试结果: S的地址和p所指向的地址并不是一个地方,可以推断0x00417704是常量区。所以貌似不能改。用反汇编其实看的更清楚一点。 指针好就好在它能指向内存,不是ROM 区的好似都能改。 |