C语言中字符串常量与字符数组

来源:互联网 发布:mac word 乱码 编辑:程序博客网 时间:2024/05/01 00:37

近日开始复习C语言,发现此前的学习中,对于字符,字符串的理解,还存在很多的纰漏之处。上午结合代码逐行调试,对几个基本概念进行了梳理,

现将一点粗浅的理解贴在这里,供备忘:


1. 字符

一种特殊的整数,用于表示机器之中的符号集,常用的为ASCII码。一个字符占用1字节的内存空间。
示例:
char a = ‘a’;
注意,字符(‘a’)和字符串(“a”)是不同的。
如果 char a = “a”; 编译器会报错,因为将指针类型传递给了char类型的变量。

同理,对于数组类型,可以用字符传递给其中的单个元素,如:


               
char s[] = "hello";char s[1] = 'a';  /*notice: 此处为字符*/char s[2] = "a";  /*error: 在内部的表示是,将字符串指针传递给char类型,编译器会报错*/char s[3] = *"a"; /*可以编译通过,因为对指向字符串常量的指针进行了解地址操作,*“a”等同与: ‘a’ */char s[4] = “abcd”[3]; /*可以编译通过,与上式同理, 等同于将指向字符串常量“abcd”首字符的指针右移3个字节并解地址得到: ‘d’ */




2. 字符串
在C语言中,字符串不能够直接表示为数据结构,而是采用字符串常量或者字符数组的方式来表示。
而在C++中,通过#include <string>, 可以直接定义字符串。



3. 字符串常量 string const or string literal
示例:
“this is a const string”
如果在表达式中使用字符串常量,会得到字符串常量的一个常量指针,指向首字符的地址。
如:
printf("%s","this is a string");

而且,和指针一样,字符串常量也能够进行这样的操作: *"this is a string" 会得到: ‘t’
而“test for the const”[1]也是可以的,会得到‘e’的结果
这样的操作虽然合法,但是并不推荐使用。

4. 字符数组(character array)

字符数组,示例:


char s[] = "hello";                    /*(1)*/char s[] = {'h','e','l','l','o','\0'}; /* (2)*/


二者是等价的。且以(1)式为常见。


注意,这与下面的例子不同:
char *s = "hello";

这一语句表示,创建了一个字符指针s,并用字符串常量“hello”首字符(即‘h’)的地址对其进行初始化
而(1)式则表示,创建了一个字符数组s,其中的内容为: h e l l o \0

这表示了字符串常量和字符数组的区别。二者都是字符串,但存在根本性的区别。
字符串常量一经创立,其值就不能改变,因为系统为其开辟的内存区域位于静态存储区中。如果试图使用其地址,然后借用“*ptr”的方式对其内容进行直接修改,系统是不允许的,会报错。
字符串常量在表达式中使用时,只是作为一个指向首字符地址的常量指针使用。
字符数组则不同,创建之后,大小不能改变,但其中的元素可以修改。
如:
char s[10];  
s[2] = 'a';

下面的例子,可能会被误认为对字符串常量进行了修改,但并非如此:

char *t = “this is a const string”;t = "this is another string";



实际上,line 1中,创建了字符指针t,用指向字符串常量“this....”首字符‘t’的地址的指针对其进行了初始化,即,字符指针t的值为字符串常量的首字符的地址;
在line 2中,将t的值修改为另一个字符串常量的首字符地址,而并没有对原来的字符串常量进行修改。


我在学习C语言字符处理部分时,因为对字符串常量,字符串,字符数组的理解不到位,多花了很多时间,希望这一篇总结能够对和我一样的初学者有所帮助。

总结一下,在C语言的语境下,字符串包括:字符串常量和字符数组。前者是静态不可变更的,只能作为右值使用,且在表达式中就是其首字符的地址,而字符数组的内容可变,大小不变。



原创粉丝点击