Summary

1)C语言中的单引号用来示意字符字面量;字符字面量的实质是一个整数

2)C语言中的双引号用来示意字符串字面量;字符串字面量的实质是一个指针(内存地址);

3)低于0x08048000这个值的内存地址都是不能间接拜访的,拜访就会段谬误;

4)留神:char类型char*类型用正确的字面量进行初始化;尽管char a = ""; char* s = 'a';都能编译的过,但应用的时候就会出意想不到的段谬误

5)字符字面量和字符串字面量的混同应用在C编译器中能够编的过,但要留神warning,工程中对于所有的warning肯定都要当成error来解决

单引号和双引号

C语言中的单引号用来示意字符字面量字符字面量的实质是一个整数,'a'在内存中占1个字节,'a'+1 示意'a'的ASCII码值加1,后果为'b'。

C语言中的双引号用来示意字符串字面量;字符串字面量的实质是一个内存地址(地址值),"a"在内存中占有2个字节,"a"+1 示意指针运算,后果指向"a"中的结束符'\0'。

  • 代码浏览:

    char* p1 = 1;char* p2 = '1';char* p3 = "1";printf("%s, %s, %s", p1, p2, p3);printf('\n');printf("\n");

    代码解析:

    p1 用一个整数字面量1进行初始化,有warning,但能够编的过,因为指针实质也是一个32(64)位的整数值p2 用一个字符字面量'1'进行初始化,同p1。字符'1'实质也是一个整数,值为49p3 用一个字符串字面量"1"进行初始化,字符串字面量的实质是一个指针(内存地址),没有问题printf(param1, ...)的第一个参数是一个指针,地址值printf('\n')能够编的过,然而warning,同p2,应用10作为一个地址值传给printf函数printf("\n")能够编的过,应用一个字符串字面量作为参数,换行综上:p1 p2 printf('\n')都是能够编的过,然而有问题的语句,在进行打印的应用就会段谬误,因为应用了谬误的地址值,拜访了不该拜访的内存,野指针!!!


  • 代码浏览:

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

    代码解析:

    c的初始化:应用一个只有空格字符的字符串字面量进行初始化;实际上是用一个指针(内存地址值)进行初始化因为char类型占1个字节,指针类型占4字节(32位),所以会产生截断再去进行while循环的判断,第一次就为false,不会进到循环中所以要正确判断字符类型和字符串类型,确保应用的类型是正确的:批改,将"\t"等都改成'\t'。

本文总结自“狄泰软件学院”唐佐林老师《C语言进阶课程》。
如有错漏之处,恳请斧正。