文章目录

一、单引号和双引号

二、小贴士

三、程序实例分析1

四、程序实例分析2

五、容易混淆的代码

六、小结


一、单引号和双引号

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

'a'表示字符字面量,在内存中占1个字节,'a'+1表示'a'的ASCII码加1,结果为'b'

"a"表示字符串字面量,在内存中占2个字节,"a"+1表示指针运算,结果指向"a"结束符'\0'

下面看一段单引号和双引号本质的代码:

#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;
}

编译后会有警告,继续运行会发生段错误,如下:

究竟问题出现在哪里呢?下面先把打印语句注释掉并运行:

#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;
}

编译运行虽然有警告,但是没有段错误,那么段错误肯定是打印语句那里了

把打印语句去掉注释

#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;
}

编译运行后果然出现了段错误

究竟是怎么回事呢?接着往下看

二、小贴士

  • 字符字面量被编译为对应的 ASCII 码
  • 字符串字面量被编译为对应的内存地址
  • printf 的第一个参数被当成字符串内存地址
  • 内存的低地址空间不能在程序中随意访问

三、程序实例分析1

注意:字符 '1' 所对应的 ASCII 码就是十六进制的 0x00000031

0x08048000 这个内存地址是非常特别的内存地址,所有低于这个地址的内存空间是不能随便访问的,一旦访问,就会发生段错误。程序里面的字符串编译之后得到的地址都是大于 0x08048000,所以在程序中可以访问。

所以说 1 和 '1' 的内存地址都不能访问,访问了就会出现段错误。如果把 printf("%s, %s, %s", p1, p2, p3); 注释打印下面的语句会发生什么?

#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;
}

输出结果如下,还是会发生段错误:

四、程序实例分析2

'\n' 字符字面量还是处于地址值区间,所以访问这个地址就会发生段错误。

如果把 printf('\n'); 注释掉

#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;
}

编译就不会出错,而且换了一行:

五、容易混淆的代码

这段代码的本意是如果字符 c 是 "\t" 或者 " " 或者 "\n",,则输入字符。

#include <stdio.h>int main()
{char c = " ";while( (c == "\t") || (c == " ") || (c == "\n") ){scanf("%c", &c);}return 0;
}

编译运行后,发现程序并没有让我们输入:

在进行解释之前,先看下面这样会发生什么:

 分析:
                1)编译后字符串"string"的内存地址被赋值给变量 c

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

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

所以说 char c = " ";  赋值后产生截断,那么 while 里面的语句也就不会执行了,这段程序是混淆了字符和字符串的概念。

可以这么改:

#include <stdio.h>int main()
{char c = ' ';while( (c == '\t') || (c == ' ') || (c == '\n') ){scanf("%c", &c);}return 0;
}

这样就能正确了:

六、小结

  • 单引号括起来的单个字符代表整数
  • 双引号括起来的字符代表字符指针
  • 编译器接受字符和字符串的比较,无任何意义
  • 编译器允许字符串对字符变量赋值,只能得到错误

【C语言进阶剖析】14.C语言中的单引号和双引号相关推荐

  1. 双引号用html语言写,js、html中的单引号、双引号及其转义使用.doc

    js.html中的单引号.双引号及其转义使用 js.html中的单引号.双引号及其转义使用js.html中的单引号.双引号及其转义使用这几天一直在画页面,身为开发人员的我之所以要画页面是因为当前项目中 ...

  2. c语言双引号和单引号的区别_Python中的单引号和双引号有什么区别?

    在Python中使用单引号或双引号是没有区别的,都可以用来表示一个字符串.但是这两种通用的表达方式可以避免出错之外,还可以减少转义字符的使用,使程序看起来更清晰. 举两个例子: 1.包含单引号的字符 ...

  3. php双引号表示什么,PHP中的单引号和双引号字符串有什么区别?

    PHP中的单引号和双引号字符串有什么区别? 我不是PHP编程的专家,但我有点困惑为什么我在PHP中看到一些代码用单引号放入字符串,有时用双引号. 我只是在.NET或C语言中知道,如果它是单引号,这意味 ...

  4. php中单引号,php中的单引号、双引号和转义字符详解

    PHP单引号及双引号均可以修饰字符串类型的数据,如果修饰的字符串中含有变量(例$name):最大的区别是: 双引号会替换变量的值,而单引号会把它当做字符串输出. 例如: 结果: 字符串$name 字符 ...

  5. js拼装html单引号双引号,js、html中的单引号、双引号及其转义使用

    js.html中的单引号.双引号及其转义使用 在js中对相关字符做判断或取值的时候很多情况下都会用到这些. ------ 在一个网页中的按钮,写onclick事件的处理代码,不小心写成如下: IE提示 ...

  6. js html 单引号,JS 和 HTML 中的单引号与双引号

    JS中的单引号与双引号 HTML中的单引号与双引号很简单,就是两个字符实体: 显示 描述 实体名称 实体编号 " 双引号.引号 " " ' 单引号.撇号 ' ' x 1 ...

  7. 已解决Python向数据库插入数据的字符串中含有单引号或双引号报错

    已解决Python向数据库插入数据的字符串中含有单引号或双引号报错:(102, b"Incorrect syntax near 'S'.DB-Lib error message 20018, ...

  8. java中双引号和单引号_Java中的单引号和双引号之间有区别吗?

    问题 Java中的单引号和双引号之间有区别吗? #1 热门回答(126 赞) 对于literalchar使用单引号,对于literalString使用双引号,如下所示: char c = 'a'; S ...

  9. PostgreSQL 中的单引号与双引号

    PostgreSQL 中的单引号与双引号 在pg中的sql,单引号用来标识实际的值,双引号用来标识表名(table name)或列名(column name)等数据库中存在的值. 如,执行一句quer ...

  10. python代码什么时候用单引号_Python 中的单引号和双引号有什么区别?

    在Python当中可以使用单引号,也可以使用双引号,那两者有什么区别吗? 简单来说,在Python中使用单引号或双引号是没有区别的,都可以用来表示一个字符串.但是这两种通用的表达方式,除了可以简化程序 ...

最新文章

  1. 机器学习公开课~~~~mooc
  2. AI换脸、声音篡改等,明确写入新版《民法典》
  3. python爬取网页上的特定链接_python3下scrapy爬虫(第三卷:初步抓取网页内容之抓取网页里的指定数据)...
  4. mariadb编译安装流程
  5. PID控制器开发笔记之十一:专家PID控制器的实现
  6. 史上最详细 VUE2.0 全套 demo 讲解 基础4(条件渲染)
  7. leetcode--single number.
  8. hdu 5443 The Water Problem 线段树
  9. Ps 初学者教程,如何向风景图中添加元素?
  10. 数学建模之时间序列分析
  11. JVM垃圾收集器基准报告 – Ionuț Baloșin 如何选择适合你的垃圾回收器
  12. TSC2004 电阻式触摸屏控制器驱动问题
  13. 计算机网络【最终版】
  14. openslide read region 出现黑块 解决办法
  15. iview form表单验证手机号
  16. Python将单一数字标签进行one-hot编码
  17. python 基础代谢率计算_基于python实现计算且附带进度条代码实例
  18. 什么是软件测试?零基础入门知识要点总结篇,5分钟带你快速了解
  19. saas系统分几种类型
  20. IT程序员的常见病:颈椎病、肩周炎 .

热门文章

  1. 关于Pycharm第三方安装失败问题解决方法
  2. 【ASTGCN之一个特征】代码解读(torch)之train_ASTGCN_r(二)
  3. Hive---浅谈Hive
  4. 阿里云k8s-常用命令(Kubernetes)
  5. leetcode每日一题1219. 黄金矿工 DFS深搜 暴力AC 正月初五祝大家财源广进~
  6. freebsd安装应用
  7. 大学英语四级涉及计算机阅读,大学英语四级阅读部分应试技巧 -电脑资料
  8. 多校联考 CSP-J 2019 第三次模拟赛 题解
  9. Rust之和mut、mut
  10. 超猛tuntap虚拟网卡实现超猛UDP隧道