一、数据类型
定义:数据类型就是固定内存大小的别名,并且描述了一个变量存放什类型。
数据:计算机要处理的数据(数字、字符串、文字、符号、图片、音视频等)
- 数据类型不仅帮助我们组织和操作数据,还决定了程序如何有效的利用内存。
- 了解数据类型的内存需求是理解计算机管理和操作数据的关键。
小贴士:程序运行需要在内存中
数据类型分类和计算方法
一、数据类型分类(重点)
(1)基本数据类型(c语言内置)
① 数值类型
整数型(整数)
短整型:short(short int 缩写)
基本型:int (使用频率高)
长整型:long (long int 缩写)
长长整型:long long (long long int 缩写,C99新增)
② 浮点型(小数,实数,实型)
单精度:float
双精度:double
长双精度型:long double (C99新增)
③ 字符型:char
(2)构造类型(C语言提供语法、用户自定义)
结构体:struct
联合体/共用体:union
枚举类型:enum
(3)指针类型
(4)空类型:void(C语言内置)
二、数据类型在内存的大小(重点)
|----|---------------------------|--------------------|-----------------------------|
| 序号 | 数据类型 | 中文说明 | 大小 |
| 1 | short(short int) | 短整型 | 2 |
| 2 | int | 基本整型 | 4 |
| 3 | long (long int) | 长整型 | 4(32位系统)/8(64位系统) |
| 4 | long long (long long int) | 长长整型 | 8 |
| 5 | float | 单精度浮点型 | 4 |
| 6 | double | 双精度浮点型 | 8 |
| 7 | char | 字符型 | 1 |
| 8 | bool(_Bool,C99新增) | 布尔型、true-真、flase-假 | bool:1、true(1):4、flase(0):4 |
小贴士:获取某个数据类型或者变量所占的字节数、使用sizeof(某个数据类型或者变量名)
sizeof() 的返size_t(无符号整型常量)用对应的%zd进行输出。
在C99 中,sizeof输出用%zd
cpp#include<stdio.h> #include <stdbool.h> int main() { printf("true size:%zd\n",sizeof(true)); //ture size:4 解释;true本身就是int 1,所以占4字节 printf("bool size:%zd\n",sizeof(bool)); //bool size:1 解释:占1字节 printf("false size:%lld\n",sizeof(false)); //false size:1 解释:占4字节 printf("int size:%zd\n",sizeof(int)); printf("long long 的大小是%zd个字节\n", sizeof(long long)); // %d 表示10进制整数 printf("long 的大小是%zd个字节\n",sizeof(long)); printf("long double的大小是%zd个字节\n",sizeof(long double)); return 0; }
总结:
①数据类型在内存中所占的字节数跟C语言的编译系统有关。
②计算某个数据类型所占字节数可以用sizeof运算符。
③布尔类型要添加 #include <stdbool.h> ,大家也可以直接使用int类型的0和1来表示布尔类型。
④在c99z中,sizeof()输出,用%zd。
二、常量
在c语言中,数据的基本表现形式是常量和变量。不管是变量还是常量,都需要在内存中申请一块空间,用于数据的存放。
定义:在程序执行过程中其值不可改变的量,称之为常量。
分类:int、float、double、char、符号常量(宏定义)。
整型常量
(1)整型常量可以用十进制、八进制、十六进制三种表现形式
- 十进制常量:由数字0~9构成,没有前缀、不能以0开头。
cpp
99,128 //正确
0 //正确
09 //错误
- 八进制常量:由数字0~7构成,以0为前缀,不能表示小数。
cpp
023,077 // 正确
00 // 正确
099 // 错误
- **十六进制常量:**由数字0~9、字母a ~ f/A ~ F构成,以0x / 0X为前缀,不能表示小数。
cpp
0xffffff // 正确
0x0 // 正确
注意:
整型常量中的长整型数据可用 L或者l 作为后缀
cpplong num = 123L;
(2)整型常量的分类:
① 有符号与无符号基本整型常量(int)
有符号表示范围:负数+0+正数,默认写的都是有符号
无符号表示范围:0+正数,内存中所有负数的位置都用来表示正数、此时它的正数范围超过有符号正数范围。
②有符号与无符号长整型常量(long)
③有符号与无符号短整型常量(short)
(二)整型常量的表示(在进制表达的基础上,添加 + - )
- 十进制表示:可以使用10个数字符号0~9以及 +,- ,如:123,-90
- 八进制表示:以0开头,可以使用7个数字符号0~7以及 +,- ,如:0123,-011
- 十六进制表示:以0x或者0X开头,可以使用 0~9 以及 A~F(a~f) ,如:0x12,-0x12
浮点型常量
C语言中浮点数就是平常说的小数(实数)、有两种表现形式:
- 十进制小数(float常量需要跟上F/f)如:0.123,-12.6、0.1234f
- 指数形式(科学计数法):
正数表示:如十进制小数1234.5的指数表示法就是1.2345e3。
负数表示:如十进制小数1234.5的指数表示法就是1.2345e-3。
注意:
① 在符号e的前面必须要有数字
② 在符号e的后面必须为整数,不能是带有小数点的实数型。
③ 实型常量的后缀用F/f表示单精度型
字符型常量
用单引号 ' ' 括起来的一个字符,如 'a', 'A', '4', '_' 等,比如: '刘' 就不是字符,一个汉字所占的字节数超过1个字符。中文符号当成汉字理解。英文输入法下输入的字母、数字、符号都是单符。
注:在 C 语言中,汉字属于 "多字节字符" ,本质上是由多个字节(char
类型)组成的序列,具体取决于编码方式(如 GBK、UTF-8 等)。
转义字符常量:以 \ 开头的字符序列,表示控制以及不可见字符。
|------|-------|--------|
| 字符形式 | 中文含义 | ASCII码 |
| \n | 换行 | 10 |
| \r | 回车 | 13 |
| \0 | 空字符 | 0 |
| \t | 水平制表符 | 9 |
注意:使用 man ascii 可以查看所有的ASCII字符。
字符串常量
说明:在c语言中,支持字符串常量、不支持字符串变量。字符串变量需要使用字符数组或者字符指针实现。
- 用一个双引号 " " 括起来的一个字符序列,如:
cpp
"How do you do? zhaopeipei"
"hello world!"
"12"
"true"
"12.25"
- 可以使用printf()输出一个字符序列,如:
cpp
printf("%s","hello world!\n");
printf("hello world!\n"); // 等价于上面写法
注意:
字符常量'a' 与 字符串常量" a "的区别:
系统自动为字符串常量加上结尾的 \0 ,使所占内存单元多一个,单字符常量的长度不变,可
用sizeof()运算符来测量。
空串和空格串:(sizeof()和strlen())
特性 | sizeof() |
strlen() |
---|---|---|
性质 | 运算符(编译时计算) | 库函数(运行时计算) |
计算对象 | 任意类型 / 变量(int、数组、结构体等) | 仅以 '\0' 结尾的字符串 |
计算内容 | 占用的总内存字节数 | 有效字符数(不含 '\0' ) |
是否依赖 '\0' |
不依赖(计算总内存) | 依赖(遇到 '\0' 停止) |
支持的类型范围 | 所有类型 | 仅字符串(char* 或 char 数组) |
cpp
#include <stdio.h>
#include <string.h>
int main() {
// 空字符串
char str1[] = "";
printf("str1: \"\" \n");
printf(" sizeof(str1) = %zd (数组总字节数)\n", sizeof(str1)); // 输出 1
printf(" strlen(str1) = %zd (有效字符数)\n", strlen(str1)); // 输出 0
// 含一个空格的字符串
char str2[] = " ";
printf("\nstr2: \" \" \n");
printf(" sizeof(str2) = %zd (数组总字节数)\n", sizeof(str2)); // 输出 2
printf(" strlen(str2) = %zd (有效字符数)\n", strlen(str2)); // 输出 1
return 0;
}

符号常量
说明:一般通过宏定义,在预处理的时候替换成具体的常量,定义一个标识符来代表常量,如用PI(代表圆周率 3.1415926)
定义符号常量
-
需要借助预处理指令: #define
-
格式:
cpp#define 宏名称 宏值
-
注意:
宏名称和宏值之间用空格隔开
句末不能添加任何符号
无参的宏名称的命名采用大写,如果有多个单词,使用下划线分隔,举例
cpp
#define MAX_VAL 9999
#define MIN_VAL 1000
举例:
cpp
#include <stdio.h>
// 定义符号常量
#define PI 3.14
#define R 20
int main(int argc,char *argv[])
{
// 计算圆的周长 2 × PI × R
printf("计算圆的周长:%f\n",2 * PI * R);// %f:以小数显示
// 计算圆的面积 PI × R × R
printf("计算圆的面积:%f\n",PI * R * R);
return 0;
}