关于字符串指针的介绍 C语言

warning:deprecated conversion from string constant to 'char *'解决方案

#include<stdio.h>
//https://blog.csdn.net/xyy410874116/article/details/6397549  
int main(){
//	char *msg;
//	msg = "hello";
//	msg = "good-bye";
//	printf("%s\n",msg);
	/*编译器会对这段代码给出两段警示,说”deprecated conversion from string constant to 'char *'",意思就是说你没有能力
	修改字符串的内容。如果将代码写成这样,如:*/
//	char *msg1 = "hello";
//	*msg1 = 'j';
//	printf( "%s/n", "hello" );
	/*编译器会通过编译,实际上会将msg指向的内容从"hello"转变为"jello" */

	/*正确的解决方法是将msg声明为一个指向不变字符串的指针*/ 
	const char  *msg2;
	msg2 = "hello";
	msg2 = "good-bye";
	printf("%s\n",msg2);
	/*这段代码可以成功编译,并且将msg指向的值如愿改变,但如果你将指针指向的指进行赋值:*/
//	*msg2 = 'j';  //将会产生一个错误,不能修改一个字符串常量

	//const char  *msg3;
	//char   buf[ 10 ];   //注意不能使用 char *buf;
	//sprintf( buf, "%03d/n", 7 );
	//puts(buf); //打印007
	//msg3 = buf;
	//puts(msg3);//打印007
	//改变buf的内容是可以的,因为它并没有被声明为常量。在这种情况下,msg将指向一个字符串,"007/n"
	//*buf = 'x';
	//puts(buf); //x07/n
//	*msg3 = 'x'; //报错 因为msg指向的内容不允许改变
	
	//使用强制转换,使用强制转换意味着你清楚会出现什么情况,不需要编译器为你做出判断,例如下面的代码将不会产生警告: 
	char  *msg4;
	msg4 = (char *) "hello"; 
	puts(msg4); //输出hello
	/*但一旦你使用强制转换,编译器对如下语句  *msg4 = 'j'; 进行编译时,也不会出现错误或警告
	不会报错这个错误将一直存在,但并不会被发现,直到运行时。那时再找出错点就相当麻烦了,比编译器提醒你,麻烦多了。
	所以,最好不要对字符串使用强制转换。*/ 
//	*msg4 = 'j';  
	
	/*Constant 指针       https://blog.csdn.net/xyy410874116/article/details/6397549 

	根据constant的位置不同,可以有以下四种情况:
	const char* const msg_0;
	const char       *msg_1;
	char* const      msg_2;
	char            *msg_3;

	其中,msg_0是一个constant指针指向一个const字符串。这个声明编译器会给出一个警告,因为msg_0的指向没有被初始化,而且之后的语句也无法对mg_0进行赋值,如
	const char const *msg_0 = "hello";
	会编译成功,但
	*msg_0 = 'j';或者
	msg_0 = "good-bye"; 将会产生错误
	msg_1既可以指向一个const字符串,也可以指向一个可变的字符串,但是不能修改它所指向的字符串的内容。
	编译msg_2这条语句,会出现和编译msg_0一样的错误。因为指针是一个常量,所以它应该首先被赋值。如果刚开始已经赋值,那么它可以对指向的字符串内容进行修改,如:
	char buf[ 10 ];
	char * const msg_2 = buf;
	这段代码里,msg_2指向buf[0],并且永远指向这个地址,不会改变;
	对于msg_3,就没太多可以说的。你可以改变指针,也可以改变指针指向的内容*/ 
	
	
} 

https://blog.csdn.net/qq_41398619/article/details/105349785
大佬原文

原创文章 36 获赞 8 访问量 2772

猜你喜欢

转载自blog.csdn.net/qq_41398619/article/details/105463680