在之前我看到string接受字符串没问题,但是用char*接受就会出现这个问题,导致我认为const char*就是string,直到最近我才发现他们之间的区别.
#include<iostream>
using namespace std;
void test()throw() {
int x = 1;
if (x==1) {
throw "字符串";
}
}
int main() {
try {
test();
}catch ( char * ) {
cout << "char*" << endl;
}
catch (string) {
cout << "string" << endl;
}
catch (...) {
cout << "未捕捉到指定类型"<<endl;
}
system("pause");
}
假如const char*和string是一个东西,那么就会输出string
但是结果是未捕捉到指定类型
string a = "字符串";
if (x==1) {
throw a;
}
抛出string类型,满意离开.
------------------------------------------------------------------------------------------------------------------
进入正题
string是字符串类型,是C++中封装的一个char*类,在C语言中没有字符串,用字符数组去存储。
#include<iostream>
using namespace std;
#include<cmath>
int main() {
char a[] = "abcd"; // 字符数组
char* p = a; //指针p指向数组首元素地址,相当于char*p="abcd"
cout << a << " " << p;
}
在之前是可以直接写char*p="abcd"的,但是直接将一个常量字符串赋值给char*是有隐患的(即char*p = "abcd"),它会做如下的操作:
1、在栈区开辟内存放char* p。
2、在文字常量区(即常量存储区)开辟内存放"abcd"。
3、将"abcd"中第一个字符的内存地址赋值给p。
崩溃隐患:当编译strcmp(p, "hello");时系统不会报错,因为符合第一个参数char*第二个参数const char*的参数限制。实际运行时,系统将试图修改文字常量区的内容,而文字常量区属于只读区,进而引发崩溃。
所以现在只能写成const char*p="abcd"。const修饰类型,可以改变指针p的指向,但是不能改变指针指向内存的值,这个涉及到指针常量,常量指针
const放在*后面,可以改变p指向内存的值,但是不能改变指针指向。