黑马程序员技术交流社区

标题: 这两个初始化有什么不同? [打印本页]

作者: الغيوم_ا    时间: 2014-7-17 23:21
标题: 这两个初始化有什么不同?
如题。char a[] = "string literal"; char *p="string literal"这两个初始化有什么不同?
作者: ofVv    时间: 2014-7-18 00:30
本帖最后由 ofVv 于 2014-7-18 00:37 编辑

前者是字符数组变量, 可以修改该字符串里的内容, 相当于为a[]赋初值;
后者是字符串常量, 内容不能修改, 相当于创建一个字符串, 然后将其首地址保存在指针p中.

  1. int main(int argc, const char * argv[])
  2. {
  3.     @autoreleasepool {

  4.         char a[] = "hello, world";
  5.         char *p = "hello, world";

  6.         a[1] = 'w';
  7.         p[1] = 'w';

  8.         printf("%s\n%s", a, p);
  9.     }
  10.     return 0;
  11. }
复制代码

第9行会报错,  EXC_BAD_ACCESS.
作者: huangqiwa    时间: 2014-7-18 14:33
ofVv 发表于 2014-7-18 00:30
前者是字符数组变量, 可以修改该字符串里的内容, 相当于为a[]赋初值;
后者是字符串常量, 内容不能修改, 相 ...

正解
前者数组名相当于指针常量,数组名不能指向其他地方
后者p是一个指针变量,指向的内容是常量不能够修改,但是可以更改指针p指向其他地方
作者: Devchen    时间: 2014-7-18 15:39
又学习了
作者: -(_)-    时间: 2014-7-18 18:41
在内存分配上是不一样的, 前者是数组类型, 用数组来存储每一个字符, 是可以修改的,  后者是指针类型, 内存生成之后是不可以修改的
作者: 且行且惜    时间: 2014-7-18 19:25
一个常量,一个是变量,a是常量,值不可以在变化,而p可以被赋值!
作者: Melody_cw    时间: 2014-7-19 16:55
这俩都是定义字符串的方法,前者里面的字符串里面的字符是可以修改的,后者是一个常量字符串不可以修改
作者: 云霄之上    时间: 2014-7-19 20:59
你可以把前者看做是字符串变量  可变 ,后者看做是字符串常量 不可变




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