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; }