高二C语言基础
第一章 1.1 C语言概述
第一章 1.2 C语言的特点
01.VS开发环境的搭建
02.第一个C语言程序
03.C语言基础语法知识
04.整型数据类型
05.浮点数据类型
06.变量与常量
07.字符常量及字符变量
08.printf函数详细解析(上)
汝城县职业中等专业学校知识库-信息中心朱老师编辑
-
+
首页
07.字符常量及字符变量
07.字符常量及字符变量
## 1、字符常量及字符变量 ### 1. 字符常量 如果我想在屏幕上打印"HelloWorld"。应该怎样做呢?大家应该很熟悉这个代码了。 ``` #include <stdio.h> int main() { printf("HelloWorld"); return 0; } ``` 我们使用 printf 函数,第一个参数是需要输出的字符串,而字符串是用双引号包括的。 不知道大家有没有考虑过,字符串是由什么组成的呢? 没错,就是我们这一节要讨论的—— 字符 。 如果我单独用字符来打印 HelloWorld ,将代码按照如下方式修改: ``` #include <stdio.h> int main() { printf("H"); printf("e"); printf("l"); printf("l"); printf("o"); printf("W"); printf("o"); printf("r"); printf("l"); printf("d"); return 0; } ``` 这样看上去,的确是在一个个地输出字符。但是,我们要注意,字符串是用双引号包括的。也就是说,这上面输出的仍然是字符串,只不过每一个字符串仅包含一个字符。那我们怎样,用单个字符的形式来输出呢? ### 定义:字符常量由单引号包括。 类似于'a' , 'b' , 'c' , '1' , '2'。这样的都是字符常量。字符常量通常只写一个字符,如果需要多个字符,请使用字符串"ab"。既然单引号包括的是字符,那我们这样打印行不行? ``` #include <stdio.h> int main() { printf('H'); printf('e'); printf('l'); printf('l'); printf('o'); printf('W'); printf('o'); printf('r'); printf('l'); printf('d'); printf('\n'); return 0; } ``` 答案是不行的,这样会导致编译报错。因为,我们之前有提到过 printf 的第一个参数必须是字符串。 既然如此,我们考虑是否能用 printf 函数的占位符来给字符占位呢? 之前我们已经了解了,整数int类型占位符为 %d ,浮点double类型占位符为 %f 。 ### 字符类型的占位符为 %c。 ``` #include <stdio.h> int main() { printf("%c%c%c%c%c%c%c%c%c%c%c", 'h', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd', '\n'); return 0; } ``` ### 2. 探究字符类型占用空间 我们可以用 sizeof 来探究一下,字符类型在计算机内部所占用的空间大小。 ### 2.1 字符常量的大小 ``` #include <stdio.h> int main() { printf("sizeof a= %d\n", sizeof('a')); printf("sizeof b= %d\n", sizeof('b')); printf("sizeof c= %d\n", sizeof('c')); printf("sizeof d= %d\n", sizeof('d')); printf("sizeof e= %d\n", sizeof('e')); return 0; } ```   字符类型**==常量==**在C编译器将字符常量看做整型,因此占用4个字节。而在C++编译器中只占1个字节。在Visual Studio中,如果你使用后缀名c为后缀名,将使用C编译器。而使用cpp为后缀名,将使用C++编译器。 ### 2.2 字符变量的大小 ``` #include <stdio.h> int main() { char c = 'A'; printf("sizeof char= %d\n", sizeof(char)); printf("sizeof c= %d\n", sizeof(c)); return 0; } ```  而字符类型的变量仅占用1个字节。 ### 3. 错误导致的意外收获 在前面的代码中,我们使用 %c 作为字符类型的占位符。假如我们不小心用错了占位符,使用了整型占位符%d,会发生什么呢? ``` #include <stdio.h> int main() { printf("%d %d %d %d %d", 'a', 'b', 'c', 'd', 'e'); return 0; } ```  观察结果,字符'a','b','c','d','e',使用整型占位符进行打印,结果居然为一些整型数值,并且数值居然是连续的。那我们有理由推测,字符和数值,存在某种联系。 ### 4. 整数与字符的对应关系——ASCII 计算机没必要直接存储字符,可以用某个数值来代表某个字符。 而这个映射关系,被称作美国信息交换标准代码(American Standard Code for Information Interchange)。我们一般将其简称为 ASCII 。  ASCII 设计的时候,仅仅考虑了拉丁字符,0到127分别对应一个字符。而一个字节最多可以表示256个数,所以,字符类型仅需要一个字节就能正常存储。我们刚刚用 sizeof 计算出字符类型占用一个字节的大小也应验了这个设计。 那么如何使用ASCII表呢?  Dec是十进制的缩写,Oct是八进制的缩写,而Chr则为字符。 例如:字符A,对应的数值为十进制的65,八进制的101,十六进制的41。 ### 5. 字符类型与字符变量 字符在计算机内部用整数表示,并且只需要用到0至127的整数范围。 若要显示成实际的字符,由printf函数根据占位符 %c 将其转换为真实的字符并打印在控制台上。既然这样,没必要为字符专门新设计一种类型,字符类型与只占用一个字节的整数类型完全一致。我们之前学习过仅占一个字节的整型类型--- char 类型。为了表示这个类型也能用于字符,这种类型使用英语character的缩写 char 来表示。 定义一个字符变量 ``` char c1 = 'a'; char c2 = '\n'; char c3 = '1'; ``` 用字符占位符,打印这三个变量。输出结果为三个字符。 ``` #include <stdio.h> int main() { char c1 = 'a'; char c2 = '\n'; char c3 = '1'; printf("c1=%c c2=%c c3=%c", c1, c2, c3); return 0; } ```  \n 为换行符,它能结束这一行的打印,从下一行开始新的打印。它是一个字符,而不是两个,在下面的转义字符中,将讨论它。 用整型占位符,打印这三个变量。输出结果为这三个字符在ASCII中所对应的数值。 ``` #include <stdio.h> int main() { char c1 = 'a'; char c2 = '\n'; char c3 = '1'; printf("c1=%d c2=%d c3=%d", c1, c2, c3); return 0; } ```  字符本身是一种整型,让printf打印出字符本身还是字符所对应的数值,就看使用哪一种占位符。 ### 6. 探究字符串常量占用空间 接下来,我们来探究一下字符串所占用的字节空间的大小。 ``` #include <stdio.h> int main() { printf("sizeof HelloWorld = %d\n", sizeof("HelloWorld")); return 0; } ```  一个字符占用一个字节的大小。但是,字符串为什么会多占用一个字节呢?  原来在字符串结尾处,为了标记这个字符串已经结束了,会在字符串会多占用一个字节,并在这个字节里面填数值0,用于标识字符串结束。 ### 7.字符零与数值零 既然零表示字符串结束,我们尝试在字符串里面故意添加零,强行让字符串结束。 ``` #include <stdio.h> int main() { printf("Hello0World"); return 0; } ```  零被当成字符正常输出了。其实,这也是可以预见的一个结果。如果零不能被正常输出,那我们连"100"这种字符串都无法正常打印。让我们再仔细观察一下ASCII表中的字符 零 ,它对应的数值其实是十进制的48。  我们需要的是数值 零 ,而不是字符 零 。 ### 8. 转义字符 那怎样表示数值 零 呢,我们再次尝试以下代码。 ``` #include <stdio.h> int main() { printf("Hello\0World"); return 0; } ```  HelloWorld字符串被我们强行截断了,printf函数只打印出了Hello就认为字符串已经结束了。  \数值 被称作转义字符。 **转义字符虽然写法上有多个字符,实际上它对应ASCII表中的一个字符。** 由于直接在字符串中写0会被认为是字符0,而 \数值 这种写法,可以让我们输入数值0。但是,这个数值不是用十进制来表示的,而是用八进制。那我们尝试直接使用数值来打印字符串Hello,注意哦,斜杠后面跟着的是八进制数值。  从上表中找到Hello所对应的八进制数值分别为110,145,154,154,157。 ``` #include <stdio.h> int main() { printf("\110\145\154\154\157"); return 0; } ```  ### 这一串字符被打印成了Hello,这进一步证明了:**转义字符虽然写法上有多个字符,实际上它对应ASCII表中的一个字符** 接下来,我们来介绍一个特殊的数值,十进制10,八进制12。看看这个数值打印出来是什么效果。 ``` #include <stdio.h> int main() { printf("Hello\12World"); return 0; } ```  如你所见,它和 \n 的效果一致,没错它们是同一个东西。 \12 就是我们之前一直在用的换行 \n 。而为什么换行会有两种写法呢? ### **由于记数值是比较麻烦的,为了方便使用一些常用到的数值可以用字母来替代。** 例如:   有一些字符无法直接在键盘上输入,这一类字符被称为 不可见字符 。就像上面的表中列出的字符,这些字符可以用斜杠加数值来表示,也可以使用斜杠加助记字母来表示。 但是不是所有的不可见都有助记字母,所以你可能还是需要查表来获得这些字符所对应的数值。  ASCII表中,数值为十进制0到31所对应的字符为不可见字符。
admin
2025年9月22日 18:20
28
0 条评论
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
Word文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
有效期