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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© الغيوم_ا 中级黑马   /  2014-7-17 23:21  /  1301 人查看  /  7 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

如题。char a[] = "string literal"; char *p="string literal"这两个初始化有什么不同?

7 个回复

倒序浏览
本帖最后由 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.
回复 使用道具 举报
ofVv 发表于 2014-7-18 00:30
前者是字符数组变量, 可以修改该字符串里的内容, 相当于为a[]赋初值;
后者是字符串常量, 内容不能修改, 相 ...

正解
前者数组名相当于指针常量,数组名不能指向其他地方
后者p是一个指针变量,指向的内容是常量不能够修改,但是可以更改指针p指向其他地方
回复 使用道具 举报
又学习了
回复 使用道具 举报
在内存分配上是不一样的, 前者是数组类型, 用数组来存储每一个字符, 是可以修改的,  后者是指针类型, 内存生成之后是不可以修改的
回复 使用道具 举报
一个常量,一个是变量,a是常量,值不可以在变化,而p可以被赋值!
回复 使用道具 举报
这俩都是定义字符串的方法,前者里面的字符串里面的字符是可以修改的,后者是一个常量字符串不可以修改
回复 使用道具 举报
你可以把前者看做是字符串变量  可变 ,后者看做是字符串常量 不可变
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马