鹰之歌

既然你崇拜鹰,就要像鹰一样翱翔天际,俯瞰大地。哪怕会摔的粉身碎骨。

导航

字符串指针与字符数组的区别

参考文献:《C专家编程》

       相信很多同学在初学编程时对char *a=”abcd”和char a[]=”abcd”混淆过,甚至某些教材根本不提其区别,只有在实际编程中出现运行时错误才会发现原来这是一个大问题。在读到《C专家编程》这一章时,对作者所讲真是深有同感,虽然很多东西自己现在是知道的,只不过自己体会是多少走了一些弯路的,要是在我最开始学编程时就能看到这本书该多好。

       数组和指针都可以在它们的定义中用字符串常量进行初始化,尽管看上去一样,底层的实现机制却不相同。

       定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。例如:下面的定义创建了一个字符串常量(为其分配了内存):

       char *p=”abcdefg”;

       注意只有对字符串常量才是如此,不能指望为浮点数之类的常量分配空间,如:

       Float *p=3.14;  /*错误,无法通过编译*/

下面结合一个实例谈谈初始化指针时创建的字符串常量与数组中的字符串的区别:

  1. 在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
  2. 数组也可以用字符串常量进行初始化:

       Char a[]=”abcdefg”;

       如指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变。

       下面是一个在vc6中的一个例子,完成将一个字符串中的所有大写字母全部转换为小写字母的功能:

View Code
1 #include<iostream.h>
2 #include<ctype.h>
3
4  /******************************************************************************/
5 /*
6 * Convert a string to lower case
7 */
8
9 int strlower(char *string)
10 {
11 if(string==NULL)
12 {
13 return -1;
14 }
15
16 while(*string)
17 {
18 if(isupper(*string))
19 *string=tolower(*string);
20 string++;
21 }
22 *string='\0';
23 return 0;
24 }
25 /*char *strlower(char *string)
26 {
27 char *s;
28
29
30
31 if (string == NULL) {
32 return NULL;
33 }
34
35 s = string;
36 while (*s) {
37 if (isupper(*s)) {
38 *s = (char) tolower(*s);
39 }
40 s++;
41 }
42 *s = '\0';
43 return string;
44 }
45 */
46
47 void main()
48 {
49 char *test="ABCDEFGhijklmN";
50 strlower(test);
51 cout<<test<<endl;
52 }

其中,如果采用char *test=”ABCDEFGhijklmN”;会产生运行时错误。Char test[]=”ABCDEFGhijklmN”则程序正常运行,原因如前所述。

posted on 2011-06-03 19:39  鹰之歌  阅读(963)  评论(0编辑  收藏  举报