C语言 sizeof关键字的具体使用

 更新时间:2024年02月26日 08:39:38   作者:嘻嘻爱编码  
在C语言中,sizeof是一个非常常用的关键字,本文主要介绍了C语言 sizeof关键字的具体使用,包括sizeof 关键字的语法、用法、特点和注意事项,感兴趣的可以了解一下

在 C 语言中,sizeof 是一个非常常用的关键字,它可以用来获取某个数据类型或变量所占用的字节数。sizeof 的结果是一个无符号整数,通常用 size_t 类型来表示。sizeof 可以用于任何数据类型,包括基本类型、指针类型、数组类型、结构体类型、联合体类型等。本文将介绍 sizeof 关键字的语法、用法、特点和注意事项。

sizeof 的语法

sizeof 的语法有两种形式,一种是用括号括起来的类型名,另一种是用括号括起来的表达式。例如:

sizeof(int) // 获取 int 类型的字节数
sizeof(a) // 获取变量 a 的字节数
sizeof(a + b) // 获取表达式 a + b 的字节数

注意,当 sizeof 的操作数是一个表达式时,它并不会计算表达式的值,而只是根据表达式的类型来确定字节数。例如:

int a = 10;
int b = 20;
sizeof(a++) // 获取 a 的字节数,不会改变 a 的值
sizeof(a + b) // 获取 a + b 的字节数,不会计算 a + b 的值

sizeof 的用法

sizeof 的用法主要有以下几种:

  • 用于获取数据类型的字节数,例如:
printf("%lu\n", sizeof(char)); // 输出 1
printf("%lu\n", sizeof(int)); // 输出 4
printf("%lu\n", sizeof(double)); // 输出 8

注意,不同的编译器和平台可能会给出不同的结果,因为 C 语言标准并没有规定每种数据类型的字节数,只是规定了它们的最小范围。一般来说,char 类型的字节数是 1,short 类型的字节数是 2,int 和 float 类型的字节数是 4,long 和 double 类型的字节数是 8,long long 和 long double 类型的字节数是 16。

  • 用于获取变量的字节数,例如:
int a = 10;
char b = 'A';
double c = 3.14;
printf("%lu\n", sizeof(a)); // 输出 4
printf("%lu\n", sizeof(b)); // 输出 1
printf("%lu\n", sizeof(c)); // 输出 8

注意,当变量是一个数组时,sizeof 会返回数组的总字节数,而不是数组的长度。例如:

int arr[10];
printf("%lu\n", sizeof(arr)); // 输出 40
printf("%lu\n", sizeof(arr) / sizeof(arr[0])); // 输出 10,计算数组的长度
  • 用于获取指针的字节数,例如:
int *p;
char *q;
double *r;
printf("%lu\n", sizeof(p)); // 输出 4 或 8,取决于平台
printf("%lu\n", sizeof(q)); // 输出 4 或 8,取决于平台
printf("%lu\n", sizeof(r)); // 输出 4 或 8,取决于平台

注意,当指针指向一个数组时,sizeof 会返回指针的字节数,而不是数组的字节数。例如:

int arr[10];
int *p = arr;
printf("%lu\n", sizeof(arr)); // 输出 40
printf("%lu\n", sizeof(p)); // 输出 4 或 8,取决于平台
  • 用于获取结构体或联合体的字节数,例如:
struct student {
    char name[20];
    int age;
    double score;
};

union data {
    int a;
    char b;
    double c;
};

struct student s;
union data d;
printf("%lu\n", sizeof(s)); // 输出 32 或 40,取决于平台和对齐方式
printf("%lu\n", sizeof(d)); // 输出 8

注意,当结构体或联合体中有数组或指针时,sizeof 会返回结构体或联合体的总字节数,而不是数组或指针的字节数。例如:

struct student {
    char *name;
    int age;
    double score;
};

union data {
    int a;
    char b[10];
    double c;
};

struct student s;
union data d;
printf("%lu\n", sizeof(s)); // 输出 16 或 24,取决于平台
printf("%lu\n", sizeof(d)); // 输出 16

sizeof 的特点

sizeof 的特点有以下几点:

  • sizeof 是一个编译时的操作符,它在编译时就会计算出操作数的字节数,而不会在运行时进行计算。
  • sizeof 的结果是一个无符号整数,通常用 size_t 类型来表示,它在头文件中定义为:
typedef unsigned int size_t;
  • sizeof 的优先级比算术运算符高,但比括号运算符低。例如:
int a = 10;
int b = 20;
printf("%lu\n", sizeof(a + b)); // 输出 4
printf("%lu\n", sizeof a + b); // 输出 24
  • sizeof 可以用于分配动态内存,例如:
int *p = (int *)malloc(10 * sizeof(int)); // 分配 10 个 int 类型的空间
  • sizeof 可以用于读取文件,例如:
FILE *fp = fopen("test.txt", "r");
char buffer[100];
size_t n = fread(buffer, sizeof(char), 100, fp); // 读取 100 个 char 类型的数据

sizeof 的注意事项

sizeof 的注意事项有以下几点:

  • sizeof 不能用于函数类型、不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知大小的数组类型、未知内容的结构体或联合体类型、void 类型等。例如:
int max(int a, int b);
int arr[];
struct student;
void f(void);

sizeof(max) // 错误,函数类型
sizeof(arr) // 错误,不完全类型
sizeof(struct student) // 错误,不完全类型
sizeof(void) // 错误,不完全类型
sizeof(f) // 错误,函数类型
  • sizeof 不能用于计算字符串的长度,因为字符串是以 ‘\0’ 结尾的字符数组,而 sizeof 会计算 ‘\0’ 的字节数。例如:
char str[] = "Hello";
printf("%lu\n", sizeof(str)); // 输出 6
printf("%lu\n", strlen(str)); // 输出 5
  • sizeof 不能用于判断两个变量是否相等,因为 sizeof 只能获取变量的字节数,而不是变量的值。例如:
int a = 10;
int b = 20;
if (sizeof(a) == sizeof(b)) // 总是成立,因为 a 和 b 的字节数都是 4
{
    printf("a and b are equal\n");
}
else
{
    printf("a and b are not equal\n");
}

总结

本文介绍了 C 语言中 sizeof 关键字的语法、用法、特点和注意事项,以及一些常见的例子。sizeof 是一个非常有用的关键字,它可以用来获取数据类型或变量的字节数,从而进行一些内存分配、文件读写、数组长度计算等操作。

到此这篇关于C语言 sizeof关键字的具体使用的文章就介绍到这了,更多相关C语言 sizeof关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于C++中0是十进制还是八进制的问题

    关于C++中0是十进制还是八进制的问题

    本篇文章中,小编将为大家介绍关于C++中0是十进制还是八进制的问题,有需要的朋友可以参考一下
    2013-04-04
  • 使用mmap实现多进程对大文件拷贝

    使用mmap实现多进程对大文件拷贝

    这篇文章主要介绍了使用mmap实现多进程对大文件拷贝,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • Linux vmstat命令实战详细解析

    Linux vmstat命令实战详细解析

    这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)
    2013-09-09
  • MATLAB全网最全的colormap的使用教程详解

    MATLAB全网最全的colormap的使用教程详解

    众所周知,MATLAB中的colormap只有少得可怜的几种,有很多应用在很特殊的图形中的colormap几乎都没有,而每次写代码都要去找颜色的图属实太麻烦。所以本文将包全部集成了进来,终于有了这套包含200个colormap的工具函数,希望对大家有所帮助
    2023-02-02
  • C/C++字节序的深入理解

    C/C++字节序的深入理解

    本文主要介绍了C/C++字节序的深入理解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C++实现哈夫曼树算法

    C++实现哈夫曼树算法

    这篇文章主要为大家详细介绍了C++实现哈夫曼树的具体代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C++ namespace命名空间解析

    C++ namespace命名空间解析

    考虑一种情况,当我们有两个同名的人,Zara,在同一个班里。当我们需要对它们进行区分我们必须使用一些额外的信息和它们的名字,比如它们生活在不同的区域或者兴趣爱好什么的,在C++程序中也会遇到同样的情况,所以命名空间就此产生
    2021-11-11
  • QT布局管理详解QVBoxLayout与QHBoxLayout及QGridLayout的使用

    QT布局管理详解QVBoxLayout与QHBoxLayout及QGridLayout的使用

    在这篇文章中,你将知道水平布局、垂直布局、网格布局如何轻松上手,以纯代码方式展示。对齐方式,大小设置,图片头像匹配标签,布局器里面的组件大小随意切换大小,认真看完这篇文章,QT布局管理器熟练使用
    2022-06-06
  • c++下使用windows api遍历指定文件夹及其子文件夹中的文件

    c++下使用windows api遍历指定文件夹及其子文件夹中的文件

    这篇文章主要介绍了c++下使用windows api遍历指定文件夹及其子文件夹中的文件实现代码,一般都是通过c++自带的函数实现
    2021-07-07
  • OpenCV使用邻居访问扫描图像的操作方法

    OpenCV使用邻居访问扫描图像的操作方法

    在图像处理中,有时需要根据某个像素的相邻像素的值计算该像素位置的值,当这个邻域包括上一行和下一行的像素时,就需要同时扫描图像的多行像素,本节中我们将介绍如何通过邻居访问扫描图像,感兴趣的朋友一起看看吧
    2023-01-01

最新评论