char *p 和 char p[]的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/simonyucsdy/article/details/82685021

看下面一段代码,思考问题。

1.存储的空间在哪里?

2.初始化的对象是什么?

3.字符串Hello World是常量吗?

int main()
{
	char p1[] = "Hello World!";
	char p2[] = "Hello World!";
	
	//在栈上创建两个数组,分别存放字符串,首地址不一样
	if(p1 == p2) {
		
	} else {
		
	}

	char *p3 = "Hello World!";
	char *p4 = "Hello World!";

	//在栈上创建两个指针,分别指向存储在静态数据区的字符串,地址一样	
	if(p3 == p4) {
		
	} else {
		
	}
}

结果显示,p1,p2不相等,p3和p4相等,char p[] = “Hello World” 的意义是在栈上创建数组,数组直接存放Hello World字符串。而char * p = "Hello World"的意义是在栈上创建指针,指向存储在静态数据区的字符串。

另外一个例子

char *ptr1() {
	char p[] = "hello";
	return p;
}

char *ptr2() {
	char *p = "hello";
	return p;
}

int main() {
	char *p1 = ptr1();
	cout << p1 << endl;  //输出乱码,而且每次输出都不一样
	char *p2 = ptr2();
	cout << p2 << endl;  //正确的输出字符串
}

p2可以正确的输出hello字符串,而每次运行时,p1都输出一个新的随机的乱码。

原因在于,ptr1()函数在栈上申请一段内存存放一个数组p,数组中存放字符串hello,p是该段内存的首地址,函数返回后,栈空间被回收,该字符串也不复存在,因此输出的内容是未知的。ptr2()函数在静态数据区申请一段内存,存储字符串hello,在栈上创建指针p,指向该段静态数据区的首地址,函数返回后,虽然指针本身被销毁了,但是静态数据区内的资源未销毁,而且通过函数的返回,该静态数据区的首地址被返回给p2,因此可以正确的输出字符串。

【1.存储的控件在哪】

第一种存储在栈上,第二种存储在静态数据区。

【2初始化的对象是什么】

第一种初始化数组对象,第二种初始化指针对象。

【3.Hello World字符串是常量吗】

第一种不是常量,而是存储在数组中的局部变量,随着函数的返回就会被销毁,第二种是字符串常量,存储在静态数据区。事实上,第二种初始化的正确写法是 const char *p = "hello",将常量字符串的地址赋给指向char常量的指针。

猜你喜欢

转载自blog.csdn.net/simonyucsdy/article/details/82685021