首先看下面一段程序:
#include <stdio.h>
int main()
{
char* p1 = 1 ;
char* p2 = '1';
char* p3 = "1";
printf("%s, %s, %s", p1, p2, p3);
printf('\n');
printf("\n");
return 0;
}
上面的程序会出现段错误,因为p1和p2两个指针指向的位置是错误的。p1指向的是内存地址为1的位置,p2指向的是内存地址为字符‘1’的ASC码49的位置,这两个指针都指向较低的地址位,是野指针,这些地址是系统保留的不能使用。只有指针p3的用法是正确的。
而且printf(‘\n’);的用法也是错误的,print第一个参数是指针,相当于给一个指针赋值,打印‘\n’的ASC码10地址的内容,这个地址是系统保留不能访问的。
C语言中的单引号用来表示字符常量,通常单引号传递的是ASC码数值。
C语言中的双引号用来表示字符串常量,通常双引号传递的是存储该内容的地址值。
举一个例子:
#include <stdio.h>
int main()
{
char c = " ";
while( c=="\t" || c==" " || c=="\n" )
{
scanf("%c", &c);
}
return 0;
}
这段代码的本意是将键盘输入的值与三个值进行比较当不是这三个时就退出,但是由于定义的c是字符变量,不是字符串,导致了程序的功能错误。char c = ” “;的含义是将“ ”字符串的地址赋值给c,但是地址是32位,c是1个字节8位,于是地址的低8位赋值给c,这样c跟三个值都不相等,程序运行后立刻退出。可以把双引号全部变为单引号。
小结
本质上单引号括起来的一个字符代表整数
双引号括起来的字符代表一个指针,是一个地址
C编译器接受字符和字符串的比较,可意义是错误的
C编译器允许字符串对字符变量赋值,其意义是可笑的