char*,char [],const char*,string之间的区别

在之前我看到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指向内存的值,但是不能改变指针指向。 

 

猜你喜欢

转载自blog.csdn.net/lxyhhhhhcl/article/details/132723476