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的。
若在*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'.
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'; 此句应该不能编译通过。
定义一个指针,同时用字符串常量对其进行初始化,编译器会将这个字符串定义为只读,不允许你再通过指针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
跟常规下一样.
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.";
实际上应该写成const *pp="I am pp.";
#11
---------------------------
新建 C++ Source (3).exe - 应用程序错误
---------------------------
"0x0040100e" 指令引用的 "0x00408128" 内存。该内存不能为 "written"。
要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定 取消
---------------------------
新建 C++ Source (3).exe - 应用程序错误
---------------------------
"0x0040100e" 指令引用的 "0x00408128" 内存。该内存不能为 "written"。
要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定 取消
---------------------------
#12
我在C-Free3.5和VC6里面都试了一下,结果相同,可以编译连接,但都只能输出一行结果,然后就是应用程序错误了。
#13
看了那么多人热心的回复,主要想说几点。
1,是用VC2005实现的,能编译,能运行= =!没试过在其他环境下的结果。
2,字符串常量,让我想起了我曾经深爱的Java,呵呵。不了解C里面的字符串跟Java比起来有哪些不一样的特点,只是这种对其值的改变,我也不确定到底能不能真的改变。
3,而且,我主要想问的是,为什么以指针方式初始化的和以数组方式初始化的,最后的结果会有如此的差异?有差异也就罢了,可对于pp的部分,从常理上讲应该是要么都改变成X,要么都不变,还是I。可一开始的结果却是变一半!
谢谢大家了。
1,是用VC2005实现的,能编译,能运行= =!没试过在其他环境下的结果。
2,字符串常量,让我想起了我曾经深爱的Java,呵呵。不了解C里面的字符串跟Java比起来有哪些不一样的特点,只是这种对其值的改变,我也不确定到底能不能真的改变。
3,而且,我主要想问的是,为什么以指针方式初始化的和以数组方式初始化的,最后的结果会有如此的差异?有差异也就罢了,可对于pp的部分,从常理上讲应该是要么都改变成X,要么都不变,还是I。可一开始的结果却是变一半!
谢谢大家了。
#14
楼主真的没有理解C的精髓。
什么是指针?
什么是数组?
什么东西在数据区(静态区)
什么东西在栈区
指针可以改变方向,就如它的名字
数组只能守在那里,不可以变心
如果一切都是属于规划好的,
国家是不允许我们乱动的。
什么是指针?
什么是数组?
什么东西在数据区(静态区)
什么东西在栈区
指针可以改变方向,就如它的名字
数组只能守在那里,不可以变心
如果一切都是属于规划好的,
国家是不允许我们乱动的。
#15
指针与数组是有较大区别的,定义一个数组时,会在内存中分配足够的空间,而指针只是一个地址值,它需要的是明确的指向一个已分配的内存空间,楼主的这种写法,如果理解为PP指向一个常量串,则不可以修改常量串,否则则是指向一个不明确的地方,这样就会出现莫名的错误。
#16
真能通过编译啊 晕
#17
不会吧? 能通过?
#18
常量 改变不了 内存不能READ!
#19
按照标注来讲是不可修改的,但是很多编译器似乎允许。。。
像BCB就是可以的
#20
#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的。
若在*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'.
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'; 此句应该不能编译通过。
定义一个指针,同时用字符串常量对其进行初始化,编译器会将这个字符串定义为只读,不允许你再通过指针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
跟常规下一样.
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.";
实际上应该写成const *pp="I am pp.";
#11
---------------------------
新建 C++ Source (3).exe - 应用程序错误
---------------------------
"0x0040100e" 指令引用的 "0x00408128" 内存。该内存不能为 "written"。
要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定 取消
---------------------------
新建 C++ Source (3).exe - 应用程序错误
---------------------------
"0x0040100e" 指令引用的 "0x00408128" 内存。该内存不能为 "written"。
要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定 取消
---------------------------
#12
我在C-Free3.5和VC6里面都试了一下,结果相同,可以编译连接,但都只能输出一行结果,然后就是应用程序错误了。
#13
看了那么多人热心的回复,主要想说几点。
1,是用VC2005实现的,能编译,能运行= =!没试过在其他环境下的结果。
2,字符串常量,让我想起了我曾经深爱的Java,呵呵。不了解C里面的字符串跟Java比起来有哪些不一样的特点,只是这种对其值的改变,我也不确定到底能不能真的改变。
3,而且,我主要想问的是,为什么以指针方式初始化的和以数组方式初始化的,最后的结果会有如此的差异?有差异也就罢了,可对于pp的部分,从常理上讲应该是要么都改变成X,要么都不变,还是I。可一开始的结果却是变一半!
谢谢大家了。
1,是用VC2005实现的,能编译,能运行= =!没试过在其他环境下的结果。
2,字符串常量,让我想起了我曾经深爱的Java,呵呵。不了解C里面的字符串跟Java比起来有哪些不一样的特点,只是这种对其值的改变,我也不确定到底能不能真的改变。
3,而且,我主要想问的是,为什么以指针方式初始化的和以数组方式初始化的,最后的结果会有如此的差异?有差异也就罢了,可对于pp的部分,从常理上讲应该是要么都改变成X,要么都不变,还是I。可一开始的结果却是变一半!
谢谢大家了。
#14
楼主真的没有理解C的精髓。
什么是指针?
什么是数组?
什么东西在数据区(静态区)
什么东西在栈区
指针可以改变方向,就如它的名字
数组只能守在那里,不可以变心
如果一切都是属于规划好的,
国家是不允许我们乱动的。
什么是指针?
什么是数组?
什么东西在数据区(静态区)
什么东西在栈区
指针可以改变方向,就如它的名字
数组只能守在那里,不可以变心
如果一切都是属于规划好的,
国家是不允许我们乱动的。
#15
指针与数组是有较大区别的,定义一个数组时,会在内存中分配足够的空间,而指针只是一个地址值,它需要的是明确的指向一个已分配的内存空间,楼主的这种写法,如果理解为PP指向一个常量串,则不可以修改常量串,否则则是指向一个不明确的地方,这样就会出现莫名的错误。
#16
真能通过编译啊 晕
#17
不会吧? 能通过?
#18
常量 改变不了 内存不能READ!
#19
按照标注来讲是不可修改的,但是很多编译器似乎允许。。。
像BCB就是可以的