黑马程序员技术交流社区

标题: 指针变量的值改变问题 [打印本页]

作者: 路默”    时间: 2014-3-27 23:40
标题: 指针变量的值改变问题
本帖最后由 路默” 于 2014-3-28 21:51 编辑

指针变量的值可不可以改变?
例如char *a="hello world";
a=a+3;
printf("%s\n"a);查资料说是可以改变

char a[]="world";
char *b="world";
a[2]='c';
b[2]='c';为什么就成非法的了   ??
作者: 周宇华    时间: 2014-3-28 03:31
char a[]="world";
// 定义一个字符数组a用来存放字符串“world”,此变量a如果是局部变量,存储的空间在栈区;如果是全局变量存储空间在静态存储区,并且这两个区域都是允许修改的,所以a[2]='c'是允许的。
char *b="world";
// 定义一个指针变量b,指向常量“world”;而常量是存储在常量区,是不允许修改,故b[2]='c'是不允许的。
作者: stone24    时间: 2014-3-28 07:30
char a[] = "world";
// "world"保存在栈空间数组里.  a[]的拷贝不是地址,而是内容,也就是“world”,可以被修改。.

char *b = "world";
// "world" 保存在静态数据区,该数据不能修改,默认是只读属性.由指针b指向. 就是一个地址的拷贝, 也就是“world”地址的拷贝,不能通过指针b来修改静态区的值。


作者: 路默”    时间: 2014-3-28 12:38
周宇华 发表于 2014-3-28 03:31
char a[]="world";
// 定义一个字符数组a用来存放字符串“world”,此变量a如果是局部变量,存储的空间在 ...

那个例子怎么是可以的啊  ?  兄弟
作者: 周宇华    时间: 2014-3-28 14:05
路默” 发表于 2014-3-28 12:38
那个例子怎么是可以的啊  ?  兄弟

这是不可以的,程序运行会出错EXC_BAD_ACCESS。
作者: agelessman    时间: 2014-3-28 14:23

char a[]
,此变量a如果是局部变量,存储的空间在栈区;
char *b
指向常量而常量是存储在常量区,是不允许修改。
作者: 于清扬    时间: 2014-3-28 21:32
char a[]="world";用数组定义字符串,存放在栈里面,一般称为字符串变量,里面的字符是可修改的。
char *b="world";用指针定义字符串,存放在常量区里面,一般称为字符串常量,里面的字符是不可修改的。
这里指针b指向的是首字符的地址,在这里就是w,而且如果你再定义一个char *c=“world”其实指向的还是同一个常量。
b[2]='c';这句等于是在修改一个常量,所以就会报错。
如果你还不明白的话可以看一下c语言基础-复杂数据类型-10指针与字符串,视频里有讲




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2