黑马程序员技术交流社区
标题:
关于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