1 C语言中的单引号和双引号

  • C语言中的单引号用来表示字符字面量
  • C语言中的双引号用来表示字符串字面量,存储于全局的只读存储区

注意上面的字符与字符串的区别

  • 下面的程序片段是否合法?

上面额三行代码,看着像是很正常,实际上问题很大。在具体分析上述代码问题之前,我们先给出一个代码示例来看看:

  • 代码 14-1.c
#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;
}
  • 上述代码编译结果如下:

  • 在程序员的眼中,警告就是错误上述错误提示告诉我们6行,7行,12行有问题。

  • 运行上述可执行程序的话,会产生段错误

由以上的程序以及编译与运行的情况来看,由以下几条知识点需要我们掌握:

  • 字符字面量,被编译为对应的ASCII码
  • 字符串字面量,被编译为对应的内存地址
  • printf() 的第一个参数,被当成是字符串的内存地址
  • 内存的低地址空间,不能被随意访问。至于这一点,如下内存图所示:

如上图所示:

  • p1变量的值是0x00000001,地址1是无法访问的。所以第6行有警告 。 地址0x00000001为什么不能访问可以自行google

  • p2变量的值是字符‘1’的ASCII码,也就是31,地址0x00000031也是不能被访问的。(第一条与第二条就印证了内存低地址不能被访问的说法)

  • p3变量的值是字符串“1” 所代表的地址,在这里是0x080484d0 。 这个地址是可以被访问的。

  • 至于第12行的警告,是因为 ‘\n’ 的ASCII码值为 10 ,那么printf 的第一个参数就是 10 ,10这个地址同样也是不能被访问到的。

1.1 双引号带来的BUG

代码:14-2.c

#include <stdio.h>

int main()
{

    char c = " ";
    
    while( (c == "\t") || (c == " ") || (c == "\n") )
    {
        scanf("%c", &c);
    }
    
    return 0;
}
  • 上述代码乍一看没问题,但是编译运行会发现有警告,且运行后并不会执行while循环。
  • 主要原因是双引号下空格,表示一个地址的值。一个地址值是占用4字节的,但是字符c是一字节的,会产生截断
  • 因为截断了。所以while循环不会成立

2 总结

  • 单引号括起来的单个字符代表整数
  • 双引号括起来的字符代表字符指针
  • 如果使用字符串对字符赋值,就会得到错误的结果