C 数据类型
数据类型
“定义”、“声明”、“赋值”与”初始化“
-
declaration
声明:说明了变量的名字和类型,但并不分配存储空间
-
definition
定义:说明了变量的名字和类型,为它分配了存储空间,但并不一定要填充初始值
-
initialization
初始化:是一种仅对全局变量(全局变量指所有函数外部)、静态变量进行的特殊的定义,若不指定初始值,则自动填充
0的隐式转换;由于不对局部变量进行,局部变量内定义后,若不赋值,则会留有垃圾值 -
assignment
赋值:将某一个数值赋给一个变量的过程,赋值只针对于已定义的变量,可以多次进行。
基本类型
使用形如 extern const int name; 声明
extern const int name = XXX; 声明并初始化
name = XXX 赋值
-
整型(整数)
分为
signed、unsigned即有、无符号两种,默认有-
长整型
-
使用
long声明 -
长度为 4 或 8 字节
-
常量
-
123l -
123ul无符号
-
-
-
整型
-
使用
int声明 -
长 4 字节
-
常量
-
123u无符号 -
0xFF十六进制 -
035八进制 -
123十进制
-
-
-
短整型
-
使用
short声明 -
长 2 字节
-
-
-
浮点(IEEE 754)
-
单精度
-
使用
float声明 -
长 4 字节,保证 6 位十进制精度
-
常量
-
2e-3科学计数法 -
2.3f
-
-
-
双精度
-
使用
double声明 -
长 8 字节,保证 15 位十进制精度
-
常量
2.3
-
-
1 |
|
1 | oct integer: 83 |
-
字元
分为
signed、unsigned即有、无符号两种,默认有-
使用
char来声明 -
占用 1 字节
-
本质是 1 字节整型,对应 ASCII 表
-
常量
-
‘a’
-
转义序列
-
\\\ 字符 -
\'’ 字符 -
\"" 字符 -
\?? 字符 -
\a警报铃声 -
\b退格键 -
\f换页符 -
\n换行符 -
\r回车 -
\t水平制表符 -
\v垂直制表符 -
\127一到三位的八进制数 -
\xAB1F4一个或多个数字的十六进制数
-
-
通用字符名
-
\uACDF后四位为 Unicode 编码(不足四位在前自动补 0) -
\uAC2FEE84后八位为 Unicode 编码(不足八位在前自动补 0)
-
-
-
-
指针
-
使用
*声明 -
长 4 字节,本质为内存地址
-
声明后若未初始化,则指向未知位置
-
数组
使用 类型名称 名称[长度(可选)] = 数组常量; 形式并初始化
-
数组常量形为
{常量, 常量, 常量, 常量} -
数组的名称实为其首元素地址,但对其求
sizeof时会返回整个数组大小 -
声明时若未手动初始化,则自动初始化为
0的相应类型转换 -
内存中变现为连续地址,多维数组亦然
字符串
-
本质为
char组成的数组,有string.h帮助操作 -
可以使用
char 名称[长度(可选)] = 字符串常量来声明并初始化,使用%s来打印 -
声明时(如下例
name变量)会自动在尾部追加\0 -
如果字符串末尾的
\0缺失,代码将崩溃。 -
字符串声明时若未手动初始化,则自动初始化为
\0 -
常量,
-
"Hello,world!"ASCII-0 字符串 -
R"F:\Doc\1"raw 字符串 -
u8"你好"u"你好"U"你好"L"你好"编码序列 UTF-8、char16_t、char32_t、wchar_t -
常量尾部会被自动添加
\0 -
相邻常量会被自动连接
-
输出格式化
%a浮点数、十六进制数字和 p-记数法(c99)%A浮点数、十六进制数字和 p-记法(c99)%c一个字符(char)%C一个 ISO 宽字符%d有符号十进制整数(int)(%ld、%Ld:长整型数据(long),%hd:输出短整形。)%e浮点数、e-科学记数法%E浮点数、E-科学记数法%f单精度浮点数(默认 float)、十进制记数法(%.nf 这里 n 表示精确到小数位后 n 位.十进制计数)%g根据数值不同自动选择%f 或%e.%G根据数值不同自动选择%f 或%e.%i有符号十进制数(与%d 相同)%o无符号八进制整数%p指针%s对应字符串 char*(%s = %hs = %hS 输出 窄字符)%S对应宽字符串 WCAHR*(%ws = %S 输出宽字符串)%u无符号十进制整数(unsigned int)%x使用十六进制数字 0xf 的无符号十六进制整数%X使用十六进制数字 0xf 的无符号十六进制整数%%打印一个百分号
1 |
|
1 | 10 |
char a[] = "string"; 与 char *p = "string";
内存中:
1 | +---+---+---+---+---+---+----+ |
对于p其string\0为常量,不可修改,如果要创建可修改字符串,使用*alloc()
结构体
1 | struct Books { |
-
使用
.访问1
2
3
4
5
6
7
8
9
10
11
struct Book {
int id;
} bok; // 立即声明 bok 为 结构体
int main(int argc, char *argv[]) {
bok.id = 1;
printf("%d", bok.id);
return 0;
} -
使用
->访问a->b等同(*a).b
1 | #include <stdio.h> |
复杂声明
1 | char *(*(*var)())[10]; |
从变量标识符开始,向右寻找最近的)或]并解释,向左寻找*并解释,重复直至结束:
-
var 被声明为
-
指向以下的指针
-
返回以下的函数
-
指向以下的指针
-
包含 10 个元素的数组,内容为
-
指向以下的指针
-
char 值
总结:var 被声明为(指向(返回(指向(包含 10 个元素的数组,内容为(指向(char 值)的指针)的指针)的函数)的指针)
var 内容为 地址 --> 函数返回:地址 --> 数组内容:地址 --> char 值
存储类
-
auto
局部,默认
-
register
存储于寄存器
-
static
静态,一经声明不再销毁
-
extern
外部,用于多文件调用
-
typedef
声明别名,例:
1 |
|
11
类型限定
-
const
定义为常量。
-
volatile
则该对象可以被其他进程或事件修改。
类型转换
C 语言为隐式转换,显式强制转换使用 (void *)name 表达式