欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言的单引号和双引号实例讲解

程序员文章站 2022-07-28 14:34:15
c语言中的单引号用来表示字符字面量 c语言中的双引号用来表示字符串字面量 例如: 'a'表示字符字面量,占1个字节,'a' + 1表示 'a'的asc...

c语言中的单引号用来表示字符字面量

c语言中的双引号用来表示字符串字面量

例如:

'a'表示字符字面量,占1个字节,'a' + 1表示 'a'的ascii码加1,结果为'b'

"a"表示字符串字面量,占两个字节,"a" + 1表示指针运算,结果指向"a"的结束符'\0'

来看一段下边的代码:

#include 

int main()
{
char* p1 =  1 ;
char* p2 = '1';
char* p3 = "1";

printf("%s, %s, %s", p1, p2, p3);

printf('\n');
printf("\n");

return 0;
}

编译运行结果如下:程序奔溃。

C语言的单引号和双引号实例讲解

下边我们来分析分析为什么程序会崩溃,首先来看几个知识点:

-字符字面量被编译为对应的ascii码

-字符串字面量被编译为对应的内存地址

-printf的第一个参数被当成字符串内存地址

-内存的低地址空间不能在程序中随意访问

有了如上几个知识点,那么上边代码的三个指针变量,指向的内存就可表示为如下:

C语言的单引号和双引号实例讲解

C语言的单引号和双引号实例讲解

从上图的内存分布,我们知道,代码已经试图去访问低地址了,所以会产生程序奔溃。

最后留一段小代码供大家分析,请思考如下代码执行后发生什么:

#include 

int main()
{

    char c = " ";
    
    while( (c == "\t") || (c == " ") || (c == "\n") )
    {
        scanf("%c", &c);
    }
    
    return 0;
}

提示:char c = "string"发生了什么?

-编译后字符串"string"的内存地址被赋值给变量c

-内存地址占用4个字节,而变量c只占用1个字节

-由于类型不同,赋值后产生截断

总结:

1、单引号括起来的字符代表字符指针

2、双引号括起来的字符代表字符指针

3、c编译器接受字符和字符串的比较,无任何意义

4、c编译器允许字符串对字符变量赋值,只能得到错误