【C语言】-数据类型及存储空间长度

1、C语言中数据类型有哪些

C语言中有以下四种数据类型。

类型具体数据类型
基本数据类型int,char,float,double
派生数据类型arry,pointer,structure,union
枚举数据类型enum
void数据类型void

void
void是空类型,一般用于函数的返回类型表示,表示函数啥都不返回。通常用于以下三种情况。

/* 1、返回函数为空 */
void exit(int status);
/* 2、函数参数为空 */
int fun(void);
/* 指针指向为空,返回值可以转换成任何数据类型 */
void* malloc(size_t size);

2、数据类型的存储空间长度

在这里插入图片描述

3、sizeof()计算存储空间长度

在 C 语言中,sizeof 是一个编译时运算符,用于计算数据类型或表达式所占用的内存字节数。合理使用 sizeof 可提高代码的可移植性和安全性,尤其在动态内存分配和数据结构操作中至关重要。

3.1、sizeof 的基本语法

sizeof(type)       // 计算类型的大小
sizeof expression  // 计算表达式的大小(括号可选)

3.2、常见的使用场景

/* (1)动态内存分配:在 malloc、calloc 中计算所需内存大小: */
int* arr = (int*)malloc(sizeof(int) * 10);  // 分配10个int的空间

/* (2)数组长度计算:获取数组元素个数: */
int arr[] = {1, 2, 3, 4, 5};
size_t length = sizeof(arr) / sizeof(arr[0]);  // 计算数组长度

/* (3)结构体 / 联合体大小:计算自定义类型的内存占用: */
struct Person {
    char name[20];
    int age;
};
printf("%zu\n", sizeof(struct Person));  // 输出结构体大小(可能>24字节,涉及对齐)

/* (4)数据传输与协议:在网络或文件传输中确定数据块大小: */
fread(buffer, sizeof(int), 10, file);  // 读取10个int到buffer

3.3、使用注意事项

(1)sizeof 是编译时运算符:

  • 在编译阶段求值,不执行表达式。
int a = 10;
sizeof(a++);  // a的值不会增加,因为sizeof在编译时处理

(2)数组名与指针的区别

  • 数组名在 sizeof 中表示整个数组:
int arr[10];
printf("%zu\n", sizeof(arr));  // 输出40(假设int为4字节)
  • 但作为函数参数时,数组名退化为指针:
void func(int arr[]) {
    printf("%zu\n", sizeof(arr));  // 输出指针大小(4或8字节)
}

(3)结构体对齐

  • 结构体大小可能因字节对齐而大于成员大小之和:
struct Example {
    char c;    // 1字节
    int i;     // 4字节
};
printf("%zu\n", sizeof(struct Example));  // 通常8字节(因对齐)

(4)void* 与其他指针大小一致

  • 所有指针类型(包括 void*)在同一平台下大小相同:
printf("%zu\n", sizeof(void*));  // 输出4或8字节

(5)不支持函数类型和位域

  • sizeof 不能用于函数类型或位域成员:
int func();
// sizeof(func);  // 错误:不能对函数使用sizeof

struct {
    unsigned int flag : 1;  // 位域
} s;
// sizeof(s.flag);  // 错误:不能对位域使用sizeof
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值