字符与字符串
字符:用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。因此,对于采用ASCII字符集的编译器而言,'a'的含义与0141(八进制)或者97(十进制)严格一致。
字符串:用双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制为零的字符'\0'初始化。
printf("Hello world\n");
与
char hello[] = {'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n', 0};
char hello[] = {'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n', '\0'};
printf(hello);
是等效的。
单引号括起的一个字符代表一个整数,双引号括起的字符代表一个指针。
char *slash = '/'; /*代表一个整数,slash却是一个指针,编译出错*/
编译出错:
printf('\n');
来代替正确的
printf("\n"); /*"\n"代表一个指针*/
整型数(一般为16位或32位)的存储空间可以容纳多个字符(一般为8位),因此有的C编译器允许在一个字符常量(以及字符串常量)中包含多个字符。
一种方法是忽略多余的字符,最后的整数值即第一个字符的整数值;
另一种方法是依次用后一个字符覆盖前一个字符,最后得到的整数值即最后一个字符的整数值。
/*
** integer_and_char_2.c
*/
#include<stdio.h>
#include<stdlib.h>
int main( void ) {
int i;
char c;
int isize = sizeof(int);
int csize = sizeof(char);
printf("sizeof(int) = %d, sizeof(char) = %d, sizeof(1) = %zd, sizeof('a') = %zd\n", isize, csize, sizeof(1), sizeof('a'));
if (isize == 2 * csize) {
/* there is a warning:
** [Warning] multi-character character constant[-Wmultichar]
*/
i = (int)('ab');
printf("1:i = %c\n", i);
}
if (isize == 4 * csize) {
/* there is a warning:
** [Warning] multi-character character constant[-Wmultichar]
*/
i = (int)('bcde');
printf("b = %c, c = %c, d = %c, e = %c\n", 'b', 'c', 'd', 'e');
printf("2:i = %c\n", i);
}
return EXIT_SUCCESS;
}
输出: