黑马程序员技术交流社区

标题: 关于C语言字符串问题 [打印本页]

作者: 沙洲冷    时间: 2014-3-27 10:50
标题: 关于C语言字符串问题
本帖最后由 沙洲冷 于 2014-3-27 14:46 编辑

哪位大神能具体讲一下char a[] = "itcast";与char *a =  "itcast";的具体区别以及他们的用途。
作者: 脸皮猴    时间: 2014-3-27 11:02
char a[] = "itcast" 是一个字符数组,也可以看成一个字符串,a就是指向这个字符串串的一个指针常量。记住是常量!就是说a中存的地址不能更改!
char *a =  "itcast" 定义一个字符串,并且把字符串的地址赋给指针变量a,这个写法a是一个指针变量!就是说a中存的地址可以改变,a可以指向别的字符串!
他们的区别就是我上面说的,用途基本都差不多,都是表示一个字符串,但是下面的用法更灵活,a可以指向别的字符串,而上面定义法就不行。

作者: stone24    时间: 2014-3-27 11:32
定义字符串的2种方式:
1.char a[] = "itcast"; // char  a[] = {'i', 't', 'c', 'a', 's', 't', '\0'};  用数组存储字符串,字符串里的字符是可以修放。
2.char *a = "itcast";指针变量a 指向字符串的首字符‘i';这样字符串其实是个常量字符串,里面的字符是不能修改的。
作者: FlyTrem    时间: 2014-3-27 11:34
本帖最后由 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是相当于一个指针常量是不能更改的,指向字符串首字符的地址的。
指针变量是不能对字符串内部的某个字符进行更改的,只能整体赋值。

作者: 胡永城    时间: 2014-3-27 13:25
本帖最后由 胡永城 于 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指向常量区的字符串常量!



作者: 沙洲冷    时间: 2014-3-27 13:41
明白了,谢谢各位的细心讲解。
作者: 秋天De神话    时间: 2014-3-27 21:57
本帖最后由 秋天De神话 于 2014-3-27 22:01 编辑

区别在于一个是 存储在常量区,可修改,  一个是存储在栈 ,不能修改,
不好意思错了, 常量区 不可修改,  在栈里面,是可以修改的





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