A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 路默” 中级黑马   /  2014-3-27 23:40  /  1821 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 路默” 于 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';为什么就成非法的了   ??

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

6 个回复

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

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报

char a[]
,此变量a如果是局部变量,存储的空间在栈区;
char *b
指向常量而常量是存储在常量区,是不允许修改。
回复 使用道具 举报
路默” 发表于 2014-3-28 12:38
那个例子怎么是可以的啊  ?  兄弟

这是不可以的,程序运行会出错EXC_BAD_ACCESS。
回复 使用道具 举报
周宇华 发表于 2014-3-28 03:31
char a[]="world";
// 定义一个字符数组a用来存放字符串“world”,此变量a如果是局部变量,存储的空间在 ...

那个例子怎么是可以的啊  ?  兄弟
回复 使用道具 举报
char a[] = "world";
// "world"保存在栈空间数组里.  a[]的拷贝不是地址,而是内容,也就是“world”,可以被修改。.

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

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
char a[]="world";
// 定义一个字符数组a用来存放字符串“world”,此变量a如果是局部变量,存储的空间在栈区;如果是全局变量存储空间在静态存储区,并且这两个区域都是允许修改的,所以a[2]='c'是允许的。
char *b="world";
// 定义一个指针变量b,指向常量“world”;而常量是存储在常量区,是不允许修改,故b[2]='c'是不允许的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马