单引号和双引号

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

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

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

请思考下面这段代码是否合法?

  char *p1 = 1;

  char *p2 = '1';

  char *p3 = "1";

实例分析:

 #include <stdio.h>

 int main()
{ char* p1 = ;
char* p2 = '';
char* p3 = ""; printf("%s, %s, %s", p1, p2, p3); printf('\n');
printf("\n"); return ;
}

这段代码会出现段错误,为什么呢?请先看一下下面的小贴士:

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

我们再来分析一下,上面的代码,p1指针和p2指针其实指向的是字符字面量,存贮于低地址,所以第10行代码会出现段错误;

第12行,由于'\n'也是一个字符字面量,所以也是存贮于低地址,由于低地址不能随意的访问,所以也会出现段错误。

我们再来看一个示例:

 #include <stdio.h>

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

char c = "string";

这段代码发生了什么?分析:

  1. 编译后字符串"string"的内存地址值被赋值给变量c
  2. 内存地址占用四个字节,而变量c值占用一个字节
  3. 由于类型不同,赋值后产生截段

由于while中的等号右边都是字符串字面量,也就是地址,存贮于高地址,而一个字节的c最大的值也就是255,所以while循环条件不可能被满足

小结:

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

最新文章

  1. chkconfig : No such file or directory
  2. Java操作文件夹的工具类
  3. C# 启动进程和杀死进程
  4. UVA 10706 Number Sequence (找规律 + 打表 + 查找)
  5. ZOJ-2343-Robbers
  6. C# DataGridView 动态添加列和调整列顺序
  7. iOS权限申请
  8. 快速简单搭建wordpress平台
  9. Idea的pom文件导入依赖包仍然报错
  10. mysql小试题
  11. [Java学习] Java类的基本运行顺序
  12. UWP DEP0700: 应用程序注册失败。[0x80073CF9] Install failed. Please contact your software vendor. (Exception from HRESULT: 0x80073CF9)
  13. 玩转storm
  14. C语言 &#183; 判定字符位置
  15. NGUI之scroll view的制作和踩坑总结
  16. Nginx(二)-- 配置文件之虚拟主机配置
  17. webpack中,css中打包背景图,路径报错
  18. Java 中的包装类
  19. 20155327 学习基础和C语言基础调查
  20. 这篇讲PHP的讲的有些道理 &amp; mb_substr &amp; 中文处理

热门文章

  1. Kindeditor单独调用多图上传
  2. HTTP杂记
  3. Refactoring in Coding
  4. lrzsz的使用
  5. Linux改变文件属性与权限
  6. SQL Server 2008数据备份与还原的原理是什么?
  7. April 20 2017 Week 16 Thursday
  8. MySQL入门很简单: 8查询数据
  9. 如何用代码的方式取出SAP C4C销售订单创建后所有业务伙伴的数据
  10. 爬虫第一篇基本库的使用——urllib