C语言之sizeof详解,5点透析,帮你真正了解它

news2024/11/29 8:04:32

今天也要继续坚持

前言

今天复习C语言了解到不少和她有关的知识,才知道之前对他了解甚少,于是写下博客及时记录自己的所得,与大家分享一下

第一点:sizeof不是函数

sizeof是一个关键字而不是函数!是的,他不是函数!!!

原因很简单,函数在调用时后面都会加一个(),这个叫函数调用操作符,但是sizeof在后面接变量时是可以不带括号的


	int a = 10;
	sizeof a;
	sizeof(a);

第二点:sizeof是求得什么

sizeof的作用是求后面东西所占内存的大小,

非也非也,当操作数是变量时它计算的是变量所占内存空间的大小,但当操作数是一个类型时,他所求的是该类型创建一个变量所占内存大小,例如:

	int a = 10;
	sizeof a;
	sizeof(a);
	sizeof(int);

这三个值都是4.

但是要注意,后面跟的是类型时必须加括号。

第三点:sizeof与strlen

谈到求大小自然想到了库函数strlen,ok那我们好好比较一下二位。

strlen:

仅限于在字符数组,字符串中使用,他的原理是从首元素开始,向后找,找到’\

‘\0'为止,然后计算二者之间的元素个数,因此可能发生数组越界。

sizeof:

当操作数是变量时它计算的是变量所占内存空间的大小,但当操作数是一个类型时,他所求的是该类型创建一个变量所占内存大小,单位是字节,不会发生数组越界。他只会关注占用多少空间,至于空间方什么他不在乎。

第四点:sizeof返回值

C语言本身没有规定他的返回值是什么类型,而是留给系统自己决定,可能是unsigned int,unsigned long,unsigned long long,所以C语言创建了一个类型别名,size_t,统一表示其类型,这就增加了代码的可移植性。

ok知道了这个,我们来看一道题

#include<stdio.h>
int main()
{
	int a = 0;
	a--;
	if (a > sizeof(a))
		printf("大于");
	else if (a < sizeof(a))
		printf("小于");
}

你的答案是小于吗,

因为a是-1,二sizeof返回值是4

哈哈,恭喜答错了,

答案是小于,这是因为sizeof返回值是无符号数,二a是有符号数,因此而者进行比较时会发生类型转化,a变为unsigned int,自然就是大于了.

第五点:sizeof中的运算

在来看一道题

#include<stdio.h>
int main()
{
	short a = 1;
	int b = 2;
	printf("%d\n",sizeof(a = b + 1));
	printf("%d", b);
}

不卖关子了,答案是2   2。

原因是sizeof中的表达式不会发生运算,他在代码进行编译的时候就已经根据表达式的类型确定了返回值,二表达式的运算发生在程序运行期间,由于编译期间已经处理了sizeof,那表达式自然也就不会运算了。

5.关于sizeof后的操作数含有数组名

要知道数组名一般就认为是指针,但有两个特例,一个是&arr,另一个是sizeof(arr),此时他们代表了整个数组,例如:

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%d", sizeof(arr));
}

结果是40

但如果里面数组名发生运算,例如:

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%d", sizeof(arr+1));
}

则结果是8或4,此时arr被看作指针,在64位平台指针大小是8个字节,32为平台下是4个

第六点sizeof与结构体

关于这个涉及到对齐数与偏移量,比较复杂

后续我会在出一篇博客专门探讨这个问题。大家可以先自己在csdn找找相关文章了解一下。

ok那么如果觉得有用的话,就点个赞支持一下吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1348624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AIGC矢量风格】黑色和白色一系列物体

基于矢量风格的一组画面&#xff1a; 矢量风格是海报设计中常见的一种风格&#xff0c;它主要使用矢量图形进行设计。矢量图形是由数学公式定义的图形&#xff0c;其特点是可以在不失去清晰度的情况下进行任意缩放&#xff0c;无论图形尺寸如何变化&#xff0c;都不会失真或模糊…

猫咪训练的方法指南,新手养猫的攻略大全

一、教程描述 本套教程可以教你学会养猫&#xff0c;让您快速成长为养猫专家。视频教程是猫咪基础训练&#xff0c;共有7个视频&#xff0c;电子书教程是养猫攻略大全&#xff0c;共有11本&#xff0c;包括爱猫养护实用手册&#xff0c;全世界250多种猫的彩色图鉴&#xff0c;…

解密C++中的forward<int>(a)和forward<int >(a):你真的了解它们之间的区别吗?

一文看尽C中的forward完美转发 一、前言二、深入理解forward和完美转发三、对forward<int>(a)的解析四、对forward<int &&>(a)的解析五、forward<int>(a)和forward<int &&>(a)的区别总结 一、前言 完美转发在C中具有重要性&#xff0…

kafka 的零拷贝原理

文章目录 kafka 的零拷贝原理 今天来跟大家聊聊kafka的零拷贝原理是什么&#xff1f; kafka 的零拷贝原理 零拷贝是一种减少数据拷贝的机制&#xff0c;能够有效提升数据的效率&#xff1b;   在实际应用中&#xff0c;如果我们需要把磁盘中的某个文件内容发送到远程服务器上…

zlib.decompressFile报错 【Bug已解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:方案1方案2此Bug解决方案总结寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了zlib.decompressFile报错 的问题。 问题: zlib.decompressFile报错,怎么解…

1. 私有云实战之基础环境搭建

文章目录 服务器搭建准备基础环境介绍展示效果iKuai展示效果iStroreOS展示效果ESXI展示效果群辉展示效果JumpServer展示kubesphere展示 环境搭建ESXI系统安装及基础网络环境配置ESXI系统安装基础网络环境配置配置虚拟交换机配置端口组 ESXI中虚拟机安装 ikuai安装及配置ikuai安…

C# PrinterSettings修改打印机纸张类型,paperType

需求&#xff1a;直接上图&#xff0c;PrinterSettings只能改变纸张大小&#xff0c;打印质量&#xff0c;无法更改打印纸类型 爱普生打印机打印照片已经设置了最高质量&#xff0c;打印图片仍不清晰&#xff0c;需要修改打印纸类型&#xff0c;使用PrintDialog调出对话框&…

普中STM32-PZ6806L开发板(HAL库函数实现-7段共阳数码管数字显示)

简介 通过操作GPIO输出电平实现驱动单个共阳数码管 0 ~ F的显示。电路原理图 数码管电路原理图 数码管与主芯片电路原理图 其他知识 1. 由原理图可知, 共阳极已接VCC, 所以只需要控制GPIO输出低电平就可以点亮7 . 的数码管了. 2. 驱动管与主芯片引脚对应关系A -> PC0…

Python学习笔记之(一)搭建Python 环境

搭建Python 环境 1. 使用工具准备1.1 Python 安装1.1.1 下载Python 安装包1.1.2 安装Python 1.2 VScode 安装1.2.1 下载VScode安装包1.2.2 给VScode安装Python 扩展 2. 第一次编写Python 程序 本篇文章以Windows 系统为例。 1. 使用工具准备 1.1 Python 安装 1.1.1 下载Pytho…

Java多线程之线程池,volatile,悲观锁,乐观锁,并发工具类

目录 1.线程池核心原理1.创建线程池2.任务拒绝策略3.自定义线程池 2.线程池的大小1.最大并行数2.影响线程池大小的因素 3.多线程常见考点&#xff08;volatile&#xff0c;悲观锁&#xff0c;乐观锁&#xff09;4.并发工具类 1.线程池核心原理 ①创建一个空的池子 ②提交任务时…

印象笔记01:初识印象笔记

印象笔记01&#xff1a;初识印象笔记 印象笔记是一个历史比较久的笔记软件&#xff0c;近几年营销渠道不断完善&#xff0c;软件生态也日渐健全。个人因为很早接触印象笔记&#xff0c;从有道云笔记转粉到印象笔记了&#xff08;2017 年&#xff09;。而且在前几年一下子开了十…

图像分割实战-系列教程3:unet医学细胞分割实战1(医学数据集、图像分割、语义分割、unet网络、代码逐行解读)

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 上篇内容&#xff1a; Unet系列算法 下篇内容&#xff1a; unet医学细胞分割实战2 1、医学细胞数据…

vite+Vue3学习笔记(3)——界面设计

1 Element-plus 这是一个基于Vue3的组件库&#xff0c;能够快速构建界面样式。 官网链接&#xff1a; https://element-plus.gitee.io/zh-CN/guide/design.html 1.1 基础组件 1.1.1 安装 项目中的终端输入&#xff1a; npm install --save element-plus 1.1.2 引用 1.1.2.1…

Spring Boot日志:从Logger到@Slf4j的探秘

写在前面 Hello大家好&#xff0c;今日是2024年的第一天&#xff0c;祝大家元旦快乐&#x1f389; 2024第一篇文章从SpringBoot日志开始 文章目录 一、前言二、日志有什么用&#xff1f;三、日志怎么用&#xff1f;四、自定义日志打印&#x1f4ac; 常见日志框架说明4.1 在程序…

打印菱形和金字塔类型(总结)

首先&#xff0c;在之前的学习中&#xff0c;我们了解了菱形的打印&#xff0c;今天我们来对金字塔和菱形这类打印图形的问题&#xff0c;我们来做一个总结。 这个总结的来源是这今天做了一道题 这道题的答案如下 这个题做起来并不难&#xff0c;拓展到这类问题中&#xff0c;…

Java智慧工地管理平台系统源码带APP端源码

智慧工地将“互联网”的理念和技术引入建筑工地&#xff0c;从施工现场源头抓起&#xff0c;最大程度地收集人员、安全、环境、材料等关键业务数据&#xff0c;依托物联网、互联网&#xff0c;建立云端大数据管理平台&#xff0c;形成“端云大数据”的业务体系和新的管理模式&a…

PTA——计算火车运行时间

本题要求根据火车的出发时间和达到时间&#xff0c;编写程序计算整个旅途所用的时间。 输入格式&#xff1a; 输入在一行中给出2个4位正整数&#xff0c;其间以空格分隔&#xff0c;分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数&#xff08;00-23&#xff0…

JavaScript:BOM操作

JavaScript&#xff1a;BOM操作 BOM与JavaScript的关系window对象window对象的常用属性方法定时器间歇函数延时函数 JavaScript执行机制同步异步事件循环 location对象navigator对象histroy对象浏览器的本地存储localStoragesessionStorage 复杂数据类型的存储JSON字符串 BOM与…

浅谈Verilog代码的执行顺序

一、组合逻辑和时序逻辑 数字电路可以分成两大类&#xff0c;一类叫组合逻辑电路&#xff0c;另一类叫做时序逻辑电路。 组合逻辑电路&#xff1a;由门电路组成&#xff0c;其某一时刻的输出状态只与该时刻的输入状态有关&#xff0c;而与电路原来的状态无关&#xff0c;并没有…

基于Java SSM框架实现健康管理系统项目【项目源码】

基于java的SSM框架实现健康管理系统演示 JSP技术 JSP是一种跨平台的网页技术&#xff0c;最终实现网页的动态效果&#xff0c;与ASP技术类似&#xff0c;都是在HTML中混合一些程序的相关代码&#xff0c;运用语言引擎来执行代码&#xff0c;JSP能够实现与管理员的交互&#xf…