【C语言进阶剖析】14.C语言中的单引号和双引号
文章目录
一、单引号和双引号
二、小贴士
三、程序实例分析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语言中的单引号和双引号相关推荐
- 双引号用html语言写,js、html中的单引号、双引号及其转义使用.doc
js.html中的单引号.双引号及其转义使用 js.html中的单引号.双引号及其转义使用js.html中的单引号.双引号及其转义使用这几天一直在画页面,身为开发人员的我之所以要画页面是因为当前项目中 ...
- c语言双引号和单引号的区别_Python中的单引号和双引号有什么区别?
在Python中使用单引号或双引号是没有区别的,都可以用来表示一个字符串.但是这两种通用的表达方式可以避免出错之外,还可以减少转义字符的使用,使程序看起来更清晰. 举两个例子: 1.包含单引号的字符 ...
- php双引号表示什么,PHP中的单引号和双引号字符串有什么区别?
PHP中的单引号和双引号字符串有什么区别? 我不是PHP编程的专家,但我有点困惑为什么我在PHP中看到一些代码用单引号放入字符串,有时用双引号. 我只是在.NET或C语言中知道,如果它是单引号,这意味 ...
- php中单引号,php中的单引号、双引号和转义字符详解
PHP单引号及双引号均可以修饰字符串类型的数据,如果修饰的字符串中含有变量(例$name):最大的区别是: 双引号会替换变量的值,而单引号会把它当做字符串输出. 例如: 结果: 字符串$name 字符 ...
- js拼装html单引号双引号,js、html中的单引号、双引号及其转义使用
js.html中的单引号.双引号及其转义使用 在js中对相关字符做判断或取值的时候很多情况下都会用到这些. ------ 在一个网页中的按钮,写onclick事件的处理代码,不小心写成如下: IE提示 ...
- js html 单引号,JS 和 HTML 中的单引号与双引号
JS中的单引号与双引号 HTML中的单引号与双引号很简单,就是两个字符实体: 显示 描述 实体名称 实体编号 " 双引号.引号 " " ' 单引号.撇号 ' ' x 1 ...
- 已解决Python向数据库插入数据的字符串中含有单引号或双引号报错
已解决Python向数据库插入数据的字符串中含有单引号或双引号报错:(102, b"Incorrect syntax near 'S'.DB-Lib error message 20018, ...
- java中双引号和单引号_Java中的单引号和双引号之间有区别吗?
问题 Java中的单引号和双引号之间有区别吗? #1 热门回答(126 赞) 对于literalchar使用单引号,对于literalString使用双引号,如下所示: char c = 'a'; S ...
- PostgreSQL 中的单引号与双引号
PostgreSQL 中的单引号与双引号 在pg中的sql,单引号用来标识实际的值,双引号用来标识表名(table name)或列名(column name)等数据库中存在的值. 如,执行一句quer ...
- python代码什么时候用单引号_Python 中的单引号和双引号有什么区别?
在Python当中可以使用单引号,也可以使用双引号,那两者有什么区别吗? 简单来说,在Python中使用单引号或双引号是没有区别的,都可以用来表示一个字符串.但是这两种通用的表达方式,除了可以简化程序 ...
最新文章
- 机器学习公开课~~~~mooc
- AI换脸、声音篡改等,明确写入新版《民法典》
- python爬取网页上的特定链接_python3下scrapy爬虫(第三卷:初步抓取网页内容之抓取网页里的指定数据)...
- mariadb编译安装流程
- PID控制器开发笔记之十一:专家PID控制器的实现
- 史上最详细 VUE2.0 全套 demo 讲解 基础4(条件渲染)
- leetcode--single number.
- hdu 5443 The Water Problem 线段树
- Ps 初学者教程,如何向风景图中添加元素?
- 数学建模之时间序列分析
- JVM垃圾收集器基准报告 – Ionuț Baloșin 如何选择适合你的垃圾回收器
- TSC2004 电阻式触摸屏控制器驱动问题
- 计算机网络【最终版】
- openslide read region 出现黑块 解决办法
- iview form表单验证手机号
- Python将单一数字标签进行one-hot编码
- python 基础代谢率计算_基于python实现计算且附带进度条代码实例
- 什么是软件测试?零基础入门知识要点总结篇,5分钟带你快速了解
- saas系统分几种类型
- IT程序员的常见病:颈椎病、肩周炎 .
热门文章
- 关于Pycharm第三方安装失败问题解决方法
- 【ASTGCN之一个特征】代码解读(torch)之train_ASTGCN_r(二)
- Hive---浅谈Hive
- 阿里云k8s-常用命令(Kubernetes)
- leetcode每日一题1219. 黄金矿工 DFS深搜 暴力AC 正月初五祝大家财源广进~
- freebsd安装应用
- 大学英语四级涉及计算机阅读,大学英语四级阅读部分应试技巧 -电脑资料
- 多校联考 CSP-J 2019 第三次模拟赛 题解
- Rust之和mut、mut
- 超猛tuntap虚拟网卡实现超猛UDP隧道