c语言sizeof运算符的理解和使用

news/2024/11/27 23:48:14/

文章目录

  • 1 sizeof作用
  • 2 sizeof使用形式
  • 3 sizeof使用示例
    • 3.1 基本数据类型
    • 3.2 变量
    • 3.3 指针变量
    • 3.4 数组
    • 3.5 结构体
    • 3.6 联合体


>>返回总目录<<

1 sizeof作用

sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。简单的说其作用就是返回一个对象或者类型所占的内存字节数。

2 sizeof使用形式

  1. 用于基本数据类型
    sizeof (type):其中数据类型必须用()括住,如sizeof(int)。
  2. 用于变量
    sizeof (var_name)或sizeof var_name:变量名可以不使用(),如sizeof (var_name)。

3 sizeof使用示例

3.1 基本数据类型

printf("len_int = %d, len_short = %d, len_double = %d, len_char = %d", 
sizeof(int), sizeof(short), sizeof(double), sizeof(char));
//输出:len_int = 4, len_short = 2, len_double = 8, len_char = 1

3.2 变量

int a = 10;
short b = 20;
double c = 9999.99;
char d = 'a';
int e[3] = {1,2,3};
int f[] = {1,2,3};
char g[] = {'a','b','c'};printf("a = %d, b = %d, c = %d, d = %d, e = %d, f = %d, g = %d", 
sizeof(a), sizeof(b), sizeof(c), sizeof(d), sizeof(e), sizeof(f), sizeof(g));
//输出:a = 4, b = 2, c = 8, d = 1, e = 12, f = 12, g = 3

3.3 指针变量

指针变量是用来存放变量地址的,等于地址总线宽度,32位计算机中,指针变量返回值一定是4,64位返回8,注意指针变量sizeof返回值与指针所指数据类型没有关系。

int a = 10;
short b = 20;
double c = 9999.99;
char d = 'a';printf("sizeof(&a) = %d, sizeof(&b) = %d, sizeof(&c) = %d, sizeof(&d) = %d", 
sizeof(&a), sizeof(&b), sizeof(&c), sizeof(&d));
//输出:sizeof(&a) = 8, sizeof(&b) = 8, sizeof(&c) = 8, sizeof(&d) = 8

3.4 数组

char a1[] = "abcde";
int a2[6];
printf("sizeof(a1) = %d, sizeof(a2) = %d", sizeof(a1), sizeof(a2));
//输出:sizeof(a1) = 6, sizeof(a2) = 24

可以通过sizeof计算数组长度,用下面的形式:

int len1 = sizeof (a1) / sizeof (char); /* 总长度/单个元素的长度 */
int len2 = sizeof (a1) / sizeof (a1[0]); /* 总长度/第一个元素的长度 */

另外注意通过下面的方式,实际返回的是指针变量的字节数。

void function(char a[2])
{/* 这里函数参数a已不再是数组类型,而是蜕变成指针,相当于char* a3,调用函此函数时,程序不会在栈上分配一个大小为2的数组,数组是“传址”的,调用者只需将实参的地址传递过去,所以a自然为指针类型(char*)。*/printf("sizeof(a) = %d", sizeof(a));
}int main()
{char a1[] = "ab";function(a1);return 0;
}
//输出:sizeof(a) = 8

3.5 结构体

在下面示例中,输出结果是8而不是5,因为涉及到字节对齐的知识,根据计算机基本原理,有助于加快计算机的取数速度,否则就得多花指令周期,因此编译器默认对结构体进行处理,让宽度为2字节的基本数据类型(如short)都位于能被2整除的地址上,宽度为4字节的基本数据类型(如int)都位于能被4整除的地址上,这样两个数中间就可能需要加入填充字节,整个结构体的sizeof值就增加了。

struct Struct1
{char c;int i;
}Struct1Val;int main()
{printf("sizeof(Struct1Val) = %d", sizeof(Struct1Val));return 0;
}
//输出:sizeof(Struct1Val) = 8

在实际开发中,一般通过结构体存放一组配置,多组配置存放在结构体数组中,可能根据需求增删数组元素,在定义数组时不要固定数组长度,通过sizeof方式可以自动计算数组长度,在需求变更时,只需要增删数组元素,而不需要在其它地方再做更改。

typedef struct
{char Name;int ID;int Gender;
}My_Struct;My_Struct My_StructList[] = 
{/* 需求变更时,只需要在此增删数组元素,其它地方不需更改 */{'A', 1, 0},{'B', 2, 1},{'C', 3, 0},{'D', 4, 1},
};int main()
{int i = 0;for(i = 0; i < sizeof(My_StructList)/sizeof(My_Struct); i++){printf("ID = %d, ", My_StructList[i].ID);}return 0;
}
//输出:ID = 1, ID = 2, ID = 3, ID = 4,

3.6 联合体

结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以整个
联合体的sizeof也就是每个成员sizeof的最大值。

union U
{int i;char c;
}unionVar;int main()
{printf("sizeof(unionVar) = %d", sizeof(unionVar));return 0;
}
//输出:sizeof(unionVar) = 4

http://www.ppmy.cn/news/979265.html

相关文章

详解CMakeLists.txt

在前一篇文章 esp32 初识 cmake 构建工具 中&#xff0c;已经用"hellow world"程序介绍了cmake最基本的用法&#xff0c;今天详细讲解CMakeLists.txt文件。 CMakeLists.txt CMakeLists.txt文件是CMake构建工具的核心配置文件。它包含了构建项目所需的一系列指令和参…

深度学习(一)

目录 一、特征工程的作用 二、深度学习的应用 三、得分函数 四、损失函数 五、前向传播 六、反向传播 一、特征工程的作用 数据特征决定了模型的上限预处理和特征提取是最核心的算法与参数选择决定了如何逼近这个上限 二、深度学习的应用 无人驾驶人脸识别分辨率重构 深…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)六:后台主页功能实现下

一、本章内容 接上一章,继续实现后端主页内容,主要实现工具栏对应相关内容的实现,包括系统消息、系统公告、全屏切换、语言切换、主题切换等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 基于VUE3+Layui从头搭建通用后台管理系统合集…

国内十大精准的现货黄金价格走势图软件最新排名(综合版)

选择国内现货黄金价格走势图软件时&#xff0c;需要考虑几个因素。首先&#xff0c;软件的稳定性和可靠性至关重要。应选择有良好声誉和长期稳定运行的平台&#xff0c;以确保价格数据的准确性和及时性。其次&#xff0c;要选择功能齐全的软件。较为优秀的软件应该提供多种技术…

基于Matlab实现30种电力电子仿真模型(附上完整源码)

本文介绍了如何使用Matlab来实现电力电子仿真模型&#xff0c;并提供了一个简单的代码示例&#xff0c;展示了如何建立一个逆变器的仿真模型并进行仿真分析。 文章目录 1. 引言2. Matlab实现电力电子仿真模型的基本步骤3. 逆变器仿真模型的示例代码4. 结果分析5. 结论6. 30个完…

MySQL本地安装遇到的问题

今天需要在本地安装mysql&#xff0c;解压到指定文件夹后&#xff0c;遇到了这两个问题&#xff1a; 1.MySQL服务无法启动 2.本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动 这两个问题在我总结看来&#xff0c;有这几个原因&#xff1a; ①…

趋动科技携手星辰天合,推出针对人工智能领域的两款联合解决方案

近日&#xff0c;趋动科技与 XSKY星辰天合联合宣布&#xff0c;结合双方优势能力和产品&#xff0c;携手推出高性能数据湖一站式方案及全协议存算一体化方案&#xff0c;帮助客户简化 AI 工作的 IT 基础设施部署&#xff0c;实现 AI 相关工作更加灵活和便捷。 全协议存算一体化…

知识图谱实战应用22-数据导入技巧与基于py2neo的金融领域风险评估的应用

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用22-数据导入技巧与基于py2neo的金融领域风险评估的应用。本文的金融领域风险评估的应用旨在利用知识图谱技术对金融风险进行评估和管理。该项目利用py2neo库与Neo4j图数据库进行交互,构建一个金融领域的知识图谱,并根…