单引号和双引号

  • 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编译器允许字符串对字符变量进行赋值,只能得到错误

C语言进阶—— 单引号和双引号14的更多相关文章

  1. C语言中 单引号与双引号的区别

    在C语言中,字符用单引号,字符串用双引号.在c1='a';中,'a'是字符常量,必须用单引号."a"表示字符串,包含两个字符,一个是'a',一个是'\0'. 用数组来存储字符串. ...

  2. 单引号、双引号、int和char

    首先说一下C语言中用单引号和双引号的不同(一直搞不清楚): 单引号代表的是一个整数,而这个整数的值是编译器所采用的字符集中的字符序列对应的值.所以一般'A'和ASCII中的65意义相同.对于双引号定义 ...

  3. C语言 单引号和双引号的区别

    最近的C语言课在教字符串,貌似N多同学搞不清楚单引号和双引号的区别,有人还以为在C语言里用哪个都可以...其实C语言中的单引号和双引号含义是一点也不一样滴... 1.含义不同. 用单引号引起的一个字符 ...

  4. [转]C语言单引号和双引号的区别

    单引号和双引号在C中的意义完全不同,包围在单引号中的一个字符只是编写整数的另一种方法.这个整数是给定的字符在实现的对照序列中的一个对应的值,即ASCII码值.因此在一个ASCII实现中,‘a’和014 ...

  5. php中的单引号、双引号和转义字符

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

  6. php中的单引号与双引号详解

    一.引号定义字符串 在Php中,通常一个字符串被定义在一对引号中,如: 'I am a string in single quotes'"I am a string in double qu ...

  7. shell中的括号(小括号,中括号,大括号)及单引号、 双引号,反引号(``)

    一.小括号,园括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号, ...

  8. Go单引号和双引号区别

    首先做个测试,看下面那个选项是正确的: A. str:='abc'+'123'B. str:="abc"+"123"C. str:='123'+"ab ...

  9. shell脚本中:单引号和双引号的区别

    单引号和双引号的区别 前面我们还留下一个疑问,定义变量时,变量的值可以由单引号' '包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明: #!/bin ...

随机推荐

  1. 从零开始的全栈工程师——js篇(作用域 this 原型笔试题练习)

    作用域 // 1. fn() function fn () { console.log(12) } var as = function () { console.log(45) } // 2. var ...

  2. 超详细Hexo+Github博客搭建小白教程

    原文链接:超详细Hexo+Github博客搭建小白教程 去年9月的时候开始搭建了第一个自己的独立博客,到现在也稍微像模像样了.很多小伙伴应该也想过搭建一个自己的博客,网上也有一堆详细教程.我在此稍稍总 ...

  3. Linux命令之查看内存和CPU消耗命令TOP使用

    1)输入top ,按enter键,即可查看服务器内存消耗情况 注意:其中PID表示进程号 :%cpu表示cpu消耗情况:%M表示内存消耗情况:通常在做性能测试的时候用到该命令: 默认为实时刷新:按s键 ...

  4. java读取指定package下的所有class

     JAVA如何扫描一个包下面的所有类,并加载到内存中去? spring中有一个<context:component-scan base-package="com.controller& ...

  5. React 环境搭建及页面调试方法

    React 环境搭建及页面调试方法 |作者:RexFang |出处:http://www.cnblogs.com/rexfang/ |关于作者:Java 程序员一枚 |版权:本文版权归作者和博客园共有 ...

  6. 梦织未来Windows驱动编程 第03课 驱动的编程规范

    最近根据梦织未来论坛的驱动教程学习了一下Windows下的驱动编程,做个笔记备忘.这是第03课<驱动的编程规范>. 驱动部分包括基本的驱动卸载函数.驱动打开关闭读取写入操作最简单的分发例程 ...

  7. IOS 分页(pagingEnabled)

    self.scrollView.pagingEnabled = YES; - (void)nextImage { // 1.增加pageControl的页码 ; ) { page = ; } else ...

  8. IOS 获取.plist文件的数据

      @property (nonatomic,strong) NSArray *apps; //获取.plist数据 /**获取plist文件的数组数据*/ -(NSArray *)apps{ if( ...

  9. POJ-1990 MooFest---两个树状数组

    题目链接: https://vjudge.net/problem/POJ-1990 题目大意: 一群牛参加完牛的节日后都有了不同程度的耳聋,第i头牛听见别人的讲话,别人的音量必须大于v[i],当两头牛 ...

  10. Android(java)学习笔记64:Android权限大全

    访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permissio ...