加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > Asp教程 > 正文

C语言查漏补缺——单引号和双引号

发布时间:2022-11-21 12:43:51 所属栏目:Asp教程 来源:
导读:  一直对于单引号和双引号有些混淆,本节讨论一下单引号和双引号的问题。

  一、基本知识

  1、C语言中单引号用来表示字符字面量

  2、C语言中双引号用来表示字符串字面量

  比如:'a
  一直对于单引号和双引号有些混淆,本节讨论一下单引号和双引号的问题。
 
  一、基本知识
 
  1、C语言中单引号用来表示字符字面量
 
  2、C语言中双引号用来表示字符串字面量
 
  比如:'a'表示字符字面量,在内存中占1个字节, 'a'+1表示的是'a'的ASCII码加1,结果为'b'
 
  "a"表示字符串字面量,在内存中占2个字节,其中,第一个字节是"a",第二个字节是结束符'\0',"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;
  }
  那么这段代码是否合法呢?
 
  在Linux下,编译运行后,结果如下
 
  C语言查漏补缺——单引号和双引号
 
  为什么会报段错误呢?下面我们进行分析。
 
  首先,我们看
 
  ????char*?p1?=??1?;
  ????char*?p2?=?'1';
  ????char*?p3?=?"1";
  char* 在是指针,根据指针的概念,对应的指针变量存储的应该是一个地址,那么上述代码的内存分布可以理解如下
 
  C语言查漏补缺——单引号和双引号
 
  也就是说,p1和p2是在内存的低地址处。这里有一点需要记住,程序的内存地址,必须要小于0x08048000,不然就会产生段错误。
 
  三、扩展
 
  #include?
  int?main()
  {
  ????char?c?=?"?";
  ????
  ????while(?(c?==?"\t")?||?(c?==?"?")?||?(c?==?"\n")?)
  前后引号还是上下引号_英文直引号弯引号用法_asp单引号
 
 
  ????{
  ????????scanf("%c",?&c);
  ????}
  ????
  ????return?0;
  }
  这段程序,在Linux中运行结果如下
 
  C语言查漏补缺——单引号和双引号
 
  可以看到程序运行以后,直接就完了,并没有我们想象中的需要输入的情况。为什么会这样呢?
 
  分析如下
 
  char?c?=?"?";
  这段代码等同于
 
  char?c?=?"string";
  1、编译后字符串"string"的内存地址被赋值给了变量c
 
  2、内存地址占用4个字节,而变量c只占用1个字节
 
  3、由于类型不同asp单引号,赋值后产生截断
 
  因此,这里需要将所有的双引号改成单引号,就可以实现。
 
  四、总结
 
  1、单引号括起来的单个字符代表整数
 
  2、双引号括起来的字符代表字符指针
 
  3、C编译器接受字符和字符串的比较,无任何意义
 
  4、C编译器允许字符串对字符变量赋值,只能得到错误
 

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!