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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沙洲冷 中级黑马   /  2014-3-27 10:50  /  1156 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 沙洲冷 于 2014-3-27 14:46 编辑

哪位大神能具体讲一下char a[] = "itcast";与char *a =  "itcast";的具体区别以及他们的用途。

评分

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

查看全部评分

6 个回复

正序浏览
本帖最后由 秋天De神话 于 2014-3-27 22:01 编辑

区别在于一个是 存储在常量区,可修改,  一个是存储在栈 ,不能修改,
不好意思错了, 常量区 不可修改,  在栈里面,是可以修改的
回复 使用道具 举报
沙洲冷 来自手机 中级黑马 2014-3-27 13:41:05
地板
明白了,谢谢各位的细心讲解。
回复 使用道具 举报
本帖最后由 胡永城 于 2014-3-27 13:29 编辑

在C语言中,字符串表现为带有'\0'字符的字符数组;
有两种表现方式:数组与指针,两种表现方式本质相同,都是找到首字符的地址,向后遍历到'\0'表示的字符串末尾。
如以下:
char s1[] = {'i', 't', 'c', 'a', 's', 't', '\0'}; //表示字符串
char s1[] = {'i', 't', 'c', 'a', 's', 't}; //仅仅表示字符数组


回到正题:
"itcast" 表示的是字符串常量,而不是只读变量(const)。
存储在全局常量区中,只保留一份实体。
就是说,一个程序中所有出现的"itcast",都是同一个!
printf("%p\n", "itcast");
所有以上语句打印结果一样!


在程序中,字符串常量代表的是其在全局常量区中得地址;
就是说"itcast",表示其在全局区中得地址。


char a[] = "itcast";//#1
char *b =  "itcast"//#2


#1:拷贝构造,把"itcast"中得所有字符拷贝到a数组中:char a[] = {'i', 't', 'c', 'a', 's', 't', '\0'}
#2:赋值,把"itcast"表示的地址赋值给b指针。


于是,就有了数组a可以更改单个字符,而指针b不可以更改了。

a[1] = 'h';    // ok
*(a+2) = 'e';   // ok

b[1] = 'h';   // error

*(b+2) = 'e';    //error


因为a是在栈上的变量。

b指向常量区的字符串常量!


回复 使用道具 举报
本帖最后由 FlyTrem 于 2014-3-27 11:38 编辑

char a[] = "itcast";是创建字符串a,并进行了初始化为itcast,可以理解为字符串数组。
char *a =  "itcast";这个是创建char类型的指针变量a,指向了一个为"itcast"的字符串。

再函数调用时,进行传递时都只要传递a就可以了,如调用a的test函数test(a);这是因为char a[] = "itcast";这里的a是相当于一个指针常量是不能更改的,指向字符串首字符的地址的。
指针变量是不能对字符串内部的某个字符进行更改的,只能整体赋值。

评分

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

查看全部评分

回复 使用道具 举报
定义字符串的2种方式:
1.char a[] = "itcast"; // char  a[] = {'i', 't', 'c', 'a', 's', 't', '\0'};  用数组存储字符串,字符串里的字符是可以修放。
2.char *a = "itcast";指针变量a 指向字符串的首字符‘i';这样字符串其实是个常量字符串,里面的字符是不能修改的。
回复 使用道具 举报
char a[] = "itcast" 是一个字符数组,也可以看成一个字符串,a就是指向这个字符串串的一个指针常量。记住是常量!就是说a中存的地址不能更改!
char *a =  "itcast" 定义一个字符串,并且把字符串的地址赋给指针变量a,这个写法a是一个指针变量!就是说a中存的地址可以改变,a可以指向别的字符串!
他们的区别就是我上面说的,用途基本都差不多,都是表示一个字符串,但是下面的用法更灵活,a可以指向别的字符串,而上面定义法就不行。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马