问一个关于字符串指针的问题

时间:2023-01-04 19:57:19
char * pp = "I am pp.";
char qq[] = "I am qq.";

cout << "pp:" << pp << " qq:"<< qq << endl;

*pp = 'X';
*qq = 'X';

cout << "pp:" << pp << " *pp:" << *pp << endl;
cout << "qq:" << qq << " *qq:" << *qq << endl;

//////////////////////////////////////////////
结果是
pp:I am pp. qq:I am qq.
pp:I am pp. *pp:X
qq:X am qq. *qq:X

为什么pp的值没变,但*pp的变了?
而同时qq的值与*qq都有了预期的改变。

19 个解决方案

#1


补充:
若在*qq = 'X'之后加以下这句
printf("pp:%p\n",pp);

那么最后的结果会变成
pp:I am pp. qq:I am qq. 
pp:I am pp. *pp:I 
qq:X am qq. *qq:X 

///////////////////////////////
这又是为什么?
我是用VC 2005的。

#2


这个应该编译都不会通过才对。

#3


*pp = 'X'; //这句没问题?
楼主啥编译器

#4


char * pp = "I am pp."; 
这个是常量字符串

#5


char * pp = "I am pp."; 
char qq[] = "I am qq."; 

cout < < "pp:" < < pp < < " qq:" < < qq < < endl; 

*pp = 'X'; //这里用的是值传递,只能改变其值,而不能改变其指向的地址下同
*qq = 'X'; 

cout < < "pp:" < < pp < < " *pp:" < < *pp < < endl; 
cout < < "qq:" < < qq < < " *qq:" < < *qq < < endl; 

////////////////////////////////////////////// 
结果是 
pp:I am pp. qq:I am qq. 
pp:I am pp. *pp:X 
qq:X am qq. *qq:X 


*pp = 'X'; //这里用的是值传递,只能改变其值,而不能改变其指向的地址,下同
*qq = 'X'; 

printf("pp:%p\n",pp); //这个是指PP指向的是字符串的首地址,即&pp[0] = 'I'.

#6


char * pp = "I am pp."; 
定义一个指针,同时用字符串常量对其进行初始化,编译器会将这个字符串定义为只读,不允许你再通过指针pp来修改这个字符串的内容。
*pp = 'X'; 此句应该不能编译通过。

#7


常量也能改??

#8


常量,和变量的不同

#9


我运行了一下,结果是:
pp:I am pp. qq:I am qq. 
pp:X am pp. *pp:X 
qq:X am qq. *qq:X 
跟常规下一样.

#10


char * pp = "I am pp."; 
实际上应该写成const *pp="I am pp."; 

#11


---------------------------
新建 C++ Source (3).exe - 应用程序错误
---------------------------
"0x0040100e" 指令引用的 "0x00408128" 内存。该内存不能为 "written"。


要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定   取消   
---------------------------

#12


我在C-Free3.5和VC6里面都试了一下,结果相同,可以编译连接,但都只能输出一行结果,然后就是应用程序错误了。

#13


看了那么多人热心的回复,主要想说几点。

1,是用VC2005实现的,能编译,能运行= =!没试过在其他环境下的结果。

2,字符串常量,让我想起了我曾经深爱的Java,呵呵。不了解C里面的字符串跟Java比起来有哪些不一样的特点,只是这种对其值的改变,我也不确定到底能不能真的改变。

3,而且,我主要想问的是,为什么以指针方式初始化的和以数组方式初始化的,最后的结果会有如此的差异?有差异也就罢了,可对于pp的部分,从常理上讲应该是要么都改变成X,要么都不变,还是I。可一开始的结果却是变一半!

谢谢大家了。

#14


楼主真的没有理解C的精髓。

什么是指针?
什么是数组?

什么东西在数据区(静态区)
什么东西在栈区

指针可以改变方向,就如它的名字
数组只能守在那里,不可以变心

如果一切都是属于规划好的,
国家是不允许我们乱动的。

#15


指针与数组是有较大区别的,定义一个数组时,会在内存中分配足够的空间,而指针只是一个地址值,它需要的是明确的指向一个已分配的内存空间,楼主的这种写法,如果理解为PP指向一个常量串,则不可以修改常量串,否则则是指向一个不明确的地方,这样就会出现莫名的错误。

#16


真能通过编译啊 晕

#17


不会吧? 能通过?

#18


常量  改变不了  内存不能READ!

#19


引用 6 楼 sunnyheyun 的回复:
char * pp = "I am pp.";
定义一个指针,同时用字符串常量对其进行初始化,编译器会将这个字符串定义为只读,不允许你再通过指针pp来修改这个字符串的内容。
*pp = 'X'; 此句应该不能编译通过。


按照标注来讲是不可修改的,但是很多编译器似乎允许。。。
像BCB就是可以的

#1


补充:
若在*qq = 'X'之后加以下这句
printf("pp:%p\n",pp);

那么最后的结果会变成
pp:I am pp. qq:I am qq. 
pp:I am pp. *pp:I 
qq:X am qq. *qq:X 

///////////////////////////////
这又是为什么?
我是用VC 2005的。

#2


这个应该编译都不会通过才对。

#3


*pp = 'X'; //这句没问题?
楼主啥编译器

#4


char * pp = "I am pp."; 
这个是常量字符串

#5


char * pp = "I am pp."; 
char qq[] = "I am qq."; 

cout < < "pp:" < < pp < < " qq:" < < qq < < endl; 

*pp = 'X'; //这里用的是值传递,只能改变其值,而不能改变其指向的地址下同
*qq = 'X'; 

cout < < "pp:" < < pp < < " *pp:" < < *pp < < endl; 
cout < < "qq:" < < qq < < " *qq:" < < *qq < < endl; 

////////////////////////////////////////////// 
结果是 
pp:I am pp. qq:I am qq. 
pp:I am pp. *pp:X 
qq:X am qq. *qq:X 


*pp = 'X'; //这里用的是值传递,只能改变其值,而不能改变其指向的地址,下同
*qq = 'X'; 

printf("pp:%p\n",pp); //这个是指PP指向的是字符串的首地址,即&pp[0] = 'I'.

#6


char * pp = "I am pp."; 
定义一个指针,同时用字符串常量对其进行初始化,编译器会将这个字符串定义为只读,不允许你再通过指针pp来修改这个字符串的内容。
*pp = 'X'; 此句应该不能编译通过。

#7


常量也能改??

#8


常量,和变量的不同

#9


我运行了一下,结果是:
pp:I am pp. qq:I am qq. 
pp:X am pp. *pp:X 
qq:X am qq. *qq:X 
跟常规下一样.

#10


char * pp = "I am pp."; 
实际上应该写成const *pp="I am pp."; 

#11


---------------------------
新建 C++ Source (3).exe - 应用程序错误
---------------------------
"0x0040100e" 指令引用的 "0x00408128" 内存。该内存不能为 "written"。


要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定   取消   
---------------------------

#12


我在C-Free3.5和VC6里面都试了一下,结果相同,可以编译连接,但都只能输出一行结果,然后就是应用程序错误了。

#13


看了那么多人热心的回复,主要想说几点。

1,是用VC2005实现的,能编译,能运行= =!没试过在其他环境下的结果。

2,字符串常量,让我想起了我曾经深爱的Java,呵呵。不了解C里面的字符串跟Java比起来有哪些不一样的特点,只是这种对其值的改变,我也不确定到底能不能真的改变。

3,而且,我主要想问的是,为什么以指针方式初始化的和以数组方式初始化的,最后的结果会有如此的差异?有差异也就罢了,可对于pp的部分,从常理上讲应该是要么都改变成X,要么都不变,还是I。可一开始的结果却是变一半!

谢谢大家了。

#14


楼主真的没有理解C的精髓。

什么是指针?
什么是数组?

什么东西在数据区(静态区)
什么东西在栈区

指针可以改变方向,就如它的名字
数组只能守在那里,不可以变心

如果一切都是属于规划好的,
国家是不允许我们乱动的。

#15


指针与数组是有较大区别的,定义一个数组时,会在内存中分配足够的空间,而指针只是一个地址值,它需要的是明确的指向一个已分配的内存空间,楼主的这种写法,如果理解为PP指向一个常量串,则不可以修改常量串,否则则是指向一个不明确的地方,这样就会出现莫名的错误。

#16


真能通过编译啊 晕

#17


不会吧? 能通过?

#18


常量  改变不了  内存不能READ!

#19


引用 6 楼 sunnyheyun 的回复:
char * pp = "I am pp.";
定义一个指针,同时用字符串常量对其进行初始化,编译器会将这个字符串定义为只读,不允许你再通过指针pp来修改这个字符串的内容。
*pp = 'X'; 此句应该不能编译通过。


按照标注来讲是不可修改的,但是很多编译器似乎允许。。。
像BCB就是可以的

#20