Appearance
数据类型
在C语言中,数据类型决定了变量可以存储什么类型的数据,以及如何存储这些数据。不同的数据类型占用不同大小的内存空间,并且支持不同的操作。在本章节中,我们将介绍C语言的各种数据类型。
1. 数据类型的分类
C语言的数据类型可以分为以下几类:
- 基本数据类型:包括整型、浮点型和字符型
- 派生数据类型:包括数组、指针、结构体、共用体等
- 枚举类型:一种特殊的整型
- 空类型:void
2. 基本数据类型
2.1 整型
整型用于存储整数,包括以下几种类型:
| 类型 | 说明 | 大小(字节) | 取值范围 |
|---|---|---|---|
char | 字符型(本质上是小整型) | 1 | -128 到 127 |
signed char | 有符号字符型 | 1 | -128 到 127 |
unsigned char | 无符号字符型 | 1 | 0 到 255 |
short | 短整型 | 2 | -32768 到 32767 |
unsigned short | 无符号短整型 | 2 | 0 到 65535 |
int | 整型 | 4 | -2147483648 到 2147483647 |
unsigned int | 无符号整型 | 4 | 0 到 4294967295 |
long | 长整型 | 4 或 8 | 取决于系统 |
unsigned long | 无符号长整型 | 4 或 8 | 取决于系统 |
long long | 长长整型 | 8 | -9223372036854775808 到 9223372036854775807 |
unsigned long long | 无符号长长整型 | 8 | 0 到 18446744073709551615 |
2.2 浮点型
浮点型用于存储带有小数点的数值,包括以下几种类型:
| 类型 | 说明 | 大小(字节) | 精度 |
|---|---|---|---|
float | 单精度浮点型 | 4 | 约7位小数 |
double | 双精度浮点型 | 8 | 约15位小数 |
long double | 长双精度浮点型 | 8 或 16 | 取决于系统 |
2.3 字符型
字符型用于存储单个字符,使用char类型:
c
char ch = 'A'; // 存储字符A
char symbol = '@'; // 存储符号@在C语言中,字符实际上是存储为ASCII码值的,例如:
c
char ch = 'A'; // 实际上存储的是ASCII码值65
printf("%c\n", ch); // 输出字符A
printf("%d\n", ch); // 输出ASCII码值653. 派生数据类型
3.1 数组
数组是相同类型元素的集合,例如:
c
int numbers[5]; // 存储5个整数的数组
char name[10]; // 存储10个字符的数组3.2 指针
指针是存储内存地址的变量,例如:
c
int *p; // 指向整型变量的指针
char *str; // 指向字符的指针3.3 结构体
结构体是不同类型元素的集合,例如:
c
struct Person {
char name[50];
int age;
float height;
};3.4 共用体
共用体是一种特殊的数据类型,允许在同一块内存中存储不同类型的数据,例如:
c
union Data {
int i;
float f;
char str[20];
};3.5 函数
函数也是一种派生数据类型,例如:
c
int add(int a, int b) {
return a + b;
}4. 枚举类型
枚举类型是一种特殊的整型,用于定义一组命名的常量,例如:
c
enum Weekday {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
};默认情况下,枚举常量的值从0开始,依次递增。你也可以显式指定枚举常量的值:
c
enum Color {
RED = 1,
GREEN = 2,
BLUE = 4
};5. 空类型
空类型void表示没有值或类型,主要用于:
- 函数返回类型:表示函数不返回任何值
- 函数参数:表示函数不接受任何参数
- 指针类型:表示通用指针
例如:
c
void print_hello() {
printf("Hello!\n");
}
void *ptr; // 通用指针6. 类型修饰符
C语言提供了一些类型修饰符,可以修改基本数据类型的行为:
6.1 signed
表示有符号类型,可以存储正数、负数和零。对于整型,signed是默认的。
c
signed int x = -10; // 可以存储负数6.2 unsigned
表示无符号类型,只能存储非负数。
c
unsigned int y = 10; // 只能存储非负数6.3 short
表示短整型,占用较少的内存空间。
c
short int z = 1000; // 短整型6.4 long
表示长整型,占用较多的内存空间。
c
long int big_num = 1000000; // 长整型7. 数据类型的大小
可以使用sizeof运算符来获取数据类型或变量占用的字节数:
c
printf("Size of int: %zu bytes\n", sizeof(int));
printf("Size of float: %zu bytes\n", sizeof(float));
printf("Size of double: %zu bytes\n", sizeof(double));
printf("Size of char: %zu bytes\n", sizeof(char));8. 数据类型的选择
在选择数据类型时,应考虑以下因素:
- 数据范围:确保所选类型能够容纳可能的最大值和最小值
- 内存空间:在不需要大空间时,选择较小的类型以节省内存
- 精度要求:对于需要高精度的计算,选择双精度浮点型
- 性能:某些类型的操作可能比其他类型更快
8.1 示例
- 存储年龄:使用
unsigned char或unsigned short(范围足够且节省空间) - 存储工资:使用
float或double(需要小数) - 存储大整数:使用
long或long long(范围更大)
9. 示例:综合运用
现在,让我们看一个综合运用各种数据类型的例子:
c
#include <stdio.h>
// 枚举类型:月份
enum Month {
JANUARY = 1,
FEBRUARY,
MARCH,
APRIL,
MAY,
JUNE,
JULY,
AUGUST,
SEPTEMBER,
OCTOBER,
NOVEMBER,
DECEMBER
};
// 结构体类型:日期
struct Date {
int day;
enum Month month;
int year;
};
// 结构体类型:学生
struct Student {
char name[50];
int id;
float gpa;
struct Date birthday;
};
int main() {
// 基本数据类型
char grade = 'A';
int age = 20;
float height = 1.75;
double weight = 65.5;
// 枚举类型
enum Month current_month = MARCH;
// 结构体类型
struct Date today = {15, MARCH, 2024};
// 结构体类型:学生
struct Student student = {
"John Doe",
12345,
3.8,
{1, JANUARY, 2004}
};
// 输出信息
printf("Grade: %c\n", grade);
printf("Age: %d\n", age);
printf("Height: %.2f meters\n", height);
printf("Weight: %.1f kg\n", weight);
printf("Current month: %d\n", current_month);
printf("Today's date: %d/%d/%d\n", today.day, today.month, today.year);
printf("Student name: %s\n", student.name);
printf("Student ID: %d\n", student.id);
printf("Student GPA: %.2f\n", student.gpa);
printf("Student birthday: %d/%d/%d\n", student.birthday.day, student.birthday.month, student.birthday.year);
return 0;
}小结
C语言提供了丰富的数据类型,包括:
- 基本数据类型:整型、浮点型和字符型
- 派生数据类型:数组、指针、结构体、共用体等
- 枚举类型:用于定义命名常量
- 空类型:void
选择合适的数据类型对于编写高效、正确的程序非常重要。在后续章节中,我们将学习如何使用变量来存储这些不同类型的数据。