C语言 数据类型
C语言 数据类型
数据类型介绍
数据类型的作用:编译器预算对象(变量)分配的内存空间大小
一、基本类型
// 字符型 char // 整型 short int long long long // 浮点型、实型 float double
二、构造类型
控制语句关键字: // 条件判断 if、else switch、case、default // 循环语句 for while、do // 循环约束语句 break、continue // 无条件跳转语句 goto // 函数返回值、结束主程序 return 存储类型关键字: // 定义局部变量 auto // 声明 extern // 建议性指令 register // 静态数据、静态函数 static // 定义常亮、只读变量 const 其他关键字: // 计算数据类型占用大小 sizeof // 定义别名、定义函数指针 typedef: // 防止编辑器优化 volatile:
三、指针类型
// 部分基础类型* 类型*
数据类型 常量与变量
1、常量:
-
在程序运行过程中,其值不能被改变的量
-
常量一般出现在表达式或赋值语句中
整型常量 |
100,200,-100,0 |
实型常量 |
3.14 , 0.125,-3.123 |
字符型常量 |
‘a’,‘b’,‘1’,‘\n’ |
字符串常量 |
“a”,“ab”,“12356” |
2、变量:
-
在程序运行过程中,其值可以改变
-
变量在使用前必须先定义,定义变量前必须有相应的数据类型
3、标识符命名规则:
-
标识符不能是关键字
-
标识符只能由字母、数字、下划线组成
-
第一个字符必须为字母或下划线
-
标识符中字母区分大小写
4、变量特点:
-
变量在编译时为其分配相应的内存空间
-
可以通过其名字和地址访问相应内存
5、案例:
#include<stdio.h> int main(void) { // 常量:在程序运行过程中 其值不能发生改变的量 称为常亮 const int price = 3;// 常量、只读变量 // 变量:在程序运行过程中 其值可以发生变化的量 称为变量 int xsk = 5;// 变量 printf("%d\n", price); printf("%d\n", xsk); return 0; }
#include <stdio.h> // 宏定义变量、可在定义常量时使用、结尾不要加;号 #define PI 3.14159 // 圆的面积 s = pi * r * r // 圆的周长 l = 2 * pi * r int main(void) { // 在定义局部变量是可以在数据类型前加修饰auto、也可以不加 auto float r = 3.4; float s = PI * r * r; float l = 2 * PI * r; // 占位符 %f 表示输出一个浮点型 lfoat、默认保留六位小数 // %.2f:表示小数点后保留两位小数 printf("圆的面积:%.2f\n", s); printf("圆的面积:%.2f\n", l); // 变量标识符规范: // 1、不能使用系统关键字 // 2、允许使用字母数字下划线 // 3、不允许字字开头 // 4、标识符区分大小写 // 5、见名知义 return 0; }
数据类型 声明与定义
说明
- 声明变量不需要建立存储空间,如:extern int a;
- 定义变量需要建立存储空间,如:int b;
限定符 |
含义 |
extern |
声明一个变量,extern声明的变量没有建立存储空间。 extern int a; |
const |
定义一个常量,常量的值不能修改。 const int a = 10; |
volatile |
防止编译器优化代码 |
register |
定义寄存器变量,提高效率。register是建议型的指令,而不是命令型的指令,如果CPU有空闲寄存器,那么register就生效,如果没有空闲寄存器,那么register无效。 |
案例
#include <stdio.h> int main() { //extern 关键字只做声明,不能做任何定义 //声明一个变量a,a在这里没有建立存储空间 extern int a; a = 10; //err, 没有空间,就不可以赋值 int b = 10; //定义一个变量b,b的类型为int,b赋值为10 return 0; }
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> int main(void) { // 告诉内存 声明a变量、可以不填 extern int a; // 定义赋值 int a = 10; return 0; }
从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义:
- int b 它既是声明,同时又是定义
- 对于 extern b来讲它只是声明不是定义
一般的情况下,把建立存储空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。
数据类型 基础类型
一、int 、short、long、long long 整型
1、整型类型
数据类型 |
占用空间 |
short(短整型) |
2字节 |
int(整型) |
4字节 |
long(长整形) |
Windows为4字节,Linux为4字节(32位),8字节(64位) |
long long(长长整形) |
8字节 |
2、占位符
打印格式 |
含义 |
%hd |
输出short类型 |
%d |
输出int类型 |
%l |
输出long类型 |
%ll |
输出long long类型 |
%hu |
输出unsigned short类型 |
%u |
输出unsigned int类型 |
%lu |
输出unsigned long类型 |
%llu |
输出unsigned long long类型 |
打印格式 |
含义 |
%d |
输出一个有符号的10进制int类型 |
%o(字母o) |
输出8进制的int类型 |
%x |
输出16进制的int类型,字母以小写输出 |
%X |
输出16进制的int类型,字母以大写写输出 |
%u |
输出一个10进制的无符号数
|
3、整型常量
整型常量 |
所需类型 |
10 |
代表int类型 |
10l, 10L |
代表long类型 |
10ll, 10LL |
代表long long类型 |
10u, 10U |
代表unsigned int类型 |
10ul, 10UL |
代表unsigned long类型 |
10ull, 10ULL |
代表unsigned long long类型 |
4、案例
#include <stdio.h> int main(void) { // 定义十进制 int a = 10; // 定义八进制:是以0开头的 int b = 0123; // 定义十六进制:是以0x开头的 int c = 0x123; // 在计算机定义数据时不可以直接定义二进制 printf("%d\n", a); // 占位符 %x 输出一个十六进制整形 printf("%x\n", c); // 占位符 %X 输出一个十六进制整形、 表示大写 printf("%X\n", c); // 占位符 %o 输出一个八进制整形 printf("%o\n", b); return 0; }
#include <stdio.h> int main(void) { // 数据类型 标识符 = 值、有符号表示,值既可以是正数也可以是负数。 // 有符号 signed (可以省略)、只能是正数,如果是负数输出十进制整形数据 signed int a = 10; // 无符号 unsigned unsigned int b = -10; printf("%d\n", a); // %u 占位符、表示输出一个无符号十进制整形数据 printf("%u\n", a); return 0; }
5、其他说明
需要注意的是,整形数据在内存中占得字节数与所选择的操作系统有关。
虽然C语言标准中没有明确规定整形数据的长度,但 long 数据证书的长度不能短于 int 类型,short 类型整数长度不能长于 int 类型。
当一个小的数据类型赋值给一个大的数据类型,不会出错,因为编译器会自动转换。但当一个大的类型赋值给一个小的数据类型,那额就可能丢失高位。
二、float、double 浮点型
1、浮点类型
数据类型 |
占用空间 |
有效数字范围 |
float |
4字节 |
7位有效数字 |
double |
8字节 |
15~16位有效数字 |
2、占位符
- float 占位符:%f
- double 占位符:%f
3、案例
#include <stdio.h> int main() { // float需要以f结尾 float a = 3.14f; double b = 3.14; printf("%.2f\n", a); printf("%1f\n", b); // sizeof 字节大小 // 浮点型数据,存储在内存中的格式分为:符号位、指数位、小数位 printf("%d\n", sizeof(float)); printf("%d\n", sizeof(double)); return 0; }
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> int main(void) { // 占位符 %e:科学计数法表示 float a = 3.2e-2f; printf("%e\n", a); return 0; }
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> int main(void) { int a = 10; float b = 3.14; // 占位符 %p:表示输出一个变量对应的内存地址编号(无符号16进制输出) printf("%p\n", &a); printf("%p\n", &b); // 大小端对齐 getchar(); return 0; }
4、其他说明
实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。
在C语言中, 浮点型变量分为两种:单精度浮点数(float)、 双精度浮点数(double), 但是double型变量所表示的浮点数比 float 型变量更精确由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。
在有效位以外的数字将被舍去,这样可能会产生一些误差。
不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。
二、char 字符型
1、字符变量说明
字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(' ')把字符括起来。
字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。
2、ASCII表(常用)
ASCII值 |
控制字符 |
ASCII值 |
字符 |
ASCII值 |
字符 |
ASCII值 |
字符 |
0 |
NUT |
32 |
(space) |
64 |
@ |
96 |
、 |
1 |
SOH |
33 |
! |
65 |
A |
97 |
a |
2 |
STX |
34 |
" |
66 |
B |
98 |
b |
3 |
ETX |
35 |
# |
67 |
C |
99 |
c |
4 |
EOT |
36 |
$ |
68 |
D |
100 |
d |
5 |
ENQ |
37 |
% |
69 |
E |
101 |
e |
6 |
ACK |
38 |
& |
70 |
F |
102 |
f |
7 |
BEL |
39 |
, |
71 |
G |
103 |
g |
8 |
BS |
40 |
( |
72 |
H |
104 |
h |
9 |
HT |
41 |
) |
73 |
I |
105 |
i |
10 |
LF |
42 |
* |
74 |
J |
106 |
j |
11 |
VT |
43 |
+ |
75 |
K |
107 |
k |
12 |
FF |
44 |
, |
76 |
L |
108 |
l |
13 |
CR |
45 |
- |
77 |
M |
109 |
m |
14 |
SO |
46 |
. |
78 |
N |
110 |
n |
15 |
SI |
47 |
/ |
79 |
O |
111 |
o |
16 |
DLE |
48 |
0 |
80 |
P |
112 |
p |
17 |
DCI |
49 |
1 |
81 |
Q |
113 |
q |
18 |
DC2 |
50 |
2 |
82 |
R |
114 |
r |
19 |
DC3 |
51 |
3 |
83 |
S |
115 |
s |
20 |
DC4 |
52 |
4 |
84 |
T |
116 |
t |
21 |
NAK |
53 |
5 |
85 |
U |
117 |
u |
22 |
SYN |
54 |
6 |
86 |
V |
118 |
v |
23 |
TB |
55 |
7 |
87 |
W |
119 |
w |
24 |
CAN |
56 |
8 |
88 |
X |
120 |
x |
25 |
EM |
57 |
9 |
89 |
Y |
121 |
y |
26 |
SUB |
58 |
: |
90 |
Z |
122 |
z |
27 |
ESC |
59 |
; |
91 |
[ |
123 |
{ |
28 |
FS |
60 |
< |
92 |
/ |
124 |
| |
29 |
GS |
61 |
= |
93 |
] |
125 |
} |
30 |
RS |
62 |
> |
94 |
^ |
126 |
` |
31 |
US |
63 |
? |
95 |
_ |
127 |
DEL |
3、转义字符
注意:红色字体标注的为不可打印字符。
转义字符 |
含义 |
ASCII码值(十进制) |
\a |
警报 |
007 |
\b |
退格(BS) ,将当前位置移到前一列 |
008 |
\f |
换页(FF),将当前位置移到下页开头 |
012 |
\n |
换行(LF) ,将当前位置移到下一行开头 |
010 |
\r |
回车(CR) ,将当前位置移到本行开头 |
013 |
\t |
水平制表(HT) (跳到下一个TAB位置) |
009 |
\v |
垂直制表(VT) |
011 |
\\ |
代表一个反斜线字符"\" |
092 |
\' |
代表一个单引号(撇号)字符 |
039 |
\" |
代表一个双引号字符 |
034 |
\? |
代表一个问号 |
063 |
\0 |
数字0 |
000 |
\ddd |
8进制转义字符,d范围0~7 |
3位8进制 |
\xhh |
16进制转义字符,h范围0~9,a~f,A~F |
3位16进制 |
4、占位符
- char 字符占位符:%c
- char 字符串占位符:%s
5、案例
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> int main01() { // 字符型变量 char ch = 'a'; // 打印字符变量 printf("%c\n", ch); // 打印字母a对应十进制数 printf("%d\n", ch); printf("字符型大小:%d\n", sizeof(ch)); return 0; } int main02() { // 结果通过ASCLL码代表数字相减,结果为ASCLL码对应字符 char ch1 = 'a'; char ch2 = 'A'; printf("%d\n", ch1 - ch2); // 通过字符串相减实现大小写切换 char ch; scanf("%c", &ch); printf("%c\n", ch - 32); return 0; }