单引号和双引号

来源:互联网 发布:高斯模糊算法实现 c 编辑:程序博客网 时间:2024/05/17 04:32

符号的技巧

专题二:符号的技巧。包括以下章节:

  • 注释符号
  • 接续符和转义符
  • 单引号和双引号
  • 逻辑运算符使用分析
  • 位运算符分析
  • ++、–操作符使用分析
  • 优先级和类型转换分析

问题

  • 讨论这个问题有意义吗?
#include <stdio.h>int main(){    char* p1 = 1; //p1指向内存地址为1的地方。赋值会出现警告,不会编译出错。    char* p2 = '1';//p2指向内存地址为49的地方('1'=49)。    char* p3 = "1";//p3指向内存中的字符串"1"常量的地址。    printf("%s, %s, %s\n", p1, p2, p3);//低位的内存地址是给操作系统使用的,不能访问。如果访问会出现段错误。    printf('\n');//printf第一个参数是char* fmt,相当于char* fmt = 10。('\n'=10)    printf("\n");    return 0;}

单引号和双引号

  • c语言中的单引号用来表示字符常量
  • c语言中的双引号用来表示字符串常量
    ‘a’表示字符常量,在内存中占1个字节,’a’+1表示’a’ASCII码+1,结果为’b’;
    “a”表示字符串常量,在内存中占2个字节(’a’和’\0’),”a”+1表示指针运算,结果指向”a”结束符’\0’。

实例分析3-1:混淆概念的代码

3-2.c

#include<stdio.h>int main(){    //将字符串" "赋值给字符c:表示将一个字符串的内存地址赋值给字符c。假如字符串" "的在内存中的地址是0xAABBCCDD,那么字符c值未0xDD。(取最后两位)    char c = " ";    //c的值0xDD,与"\t"的地址值," "的地址值,"\n"的地址值比较    while(c == "\t" || c == " " || c == "\n")    {        scanf("%c", &c);    }    return 0;}

编译结果:
这里写图片描述

正确的写法:

3-3.c

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

结果:
这里写图片描述

小结

  • 本质上单引号括起来的一个字符代表一个整数
  • 双引号括起来的内容代表一个字符串,一个指针(字符串常量所在的内存地址)
  • c编译器结束字符和字符串的比较,可意义是错误的
  • c编译器允许把字符串赋值给一个字符变量,但是没意义