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

今天也要继续坚持

前言

今天复习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.hqwc.cn/news/313514.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

仓库管理系统

基于SSM框架的仓库管理系统

1.5 FMEA项目规划:5T

文章目录 1.5.1 FMEA目的1.5.2 FMEA时间节点1.5.3 FMEA团队1.5.3.1 设计FMEA团队1.5.3.2 过程FMEA团队1.5.3.3 FMEA团队角色和职责 1.5.4 FMEA任务1.5.5 FMEA工具 为确保及时获得最佳效果并避免FMEA返工&#xff0c;以下五个主题应在设计FMEA和过程FMEA开始时讨论&#xff0c;它…

message: 没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 `miniprogra

第一步&#xff1a;修改 project.config.json 文件 "packNpmRelationList": [{"packageJsonPath": "./package.json","miniprogramNpmDistDir": "./miniprogram/"}], "packNpmManually": true 第二步&#xff1a;…

Qt5 安装教程 - 跳过登录界面

Qt5 安装教程 - 跳过登录界面 引言一、下载二、安装三、使用四、修改、维护、卸载 引言 Qt5.14.2及以前的版本有离线安装包&#xff0c;无需登录 (老版本连登录界面也无)。之后的版本需登录进行在线安装。 本文以Qt5.12.2版本为例&#xff0c;说明如何跳过登录界面&#xff0c…

2024.1.1每日一题

LeetCode每日一题 新的一年开始了&#xff0c;祝大家新年快乐&#xff0c;坚持做每日一题。 1599.经营摩天轮的最大利润 1599. 经营摩天轮的最大利润 - 力扣&#xff08;LeetCode&#xff09; 题目描述 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0…

计算机网络第一课

先了解层级&#xff1a; 传输的信息称为协议数据单元&#xff08;PDU&#xff09;&#xff0c;PDU在每个层次的称呼都不同&#xff0c;见下图&#xff1a;

pyqt5用qtdesign设计页面时,去掉页面的空白界面、边框和标题栏

前言 Windows默认的标题栏有时候自己觉得不太美观&#xff0c;就想自己设计一个&#xff0c;然后把默认的去掉&#xff0c;并且把长方形的边框和多余的空表界面去掉&#xff0c;就是下图中圈出来的区域&#xff1a; 去掉之后的效果如图&#xff1a; 这样我们就可以自定义窗…

【Java进阶篇】JDK新版本中的新特性都有哪些

JDK新版本中的新特性都有哪些 ✔️经典解析✔️拓展知识仓✔️本地变量类型推断✔️Switch 表达式✔️Text Blocks✔️Records✔️封装类✔️instanceof 模式匹配✔️switch 模式匹配 ✅✔️虚拟线程 ✔️经典解析 JDK 8中推出了Lambda表达式、Stream、Optional、新的日期API等…

一文搞懂什么是缓存穿透、缓存雪崩、缓存击穿三个概念,以及解决方案

先理解概念&#xff1a;【注&#xff1a;我们这里说的是分布式、高并发环境】 一、缓存穿透是什么&#xff1f; 缓存穿透是指&#xff1a;请求【可以有很多】的数据在缓存、关系型数据库中都不存在&#xff0c;每次来查询都会查询到关系型数据库中。 解决方案&#xff1a; 1、将…

【STM32】STM32学习笔记-TIM输入捕获(17)

00. 目录 文章目录 00. 目录01. 输入捕获简介02. 频率测量03. 输入捕获通道04. 主从触发模式05. 输入捕获基本结构06. PWMI基本结构07. 其它08. 附录 01. 输入捕获简介 IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平…

ThreadLocal 是什么?它的实现原理是什么?

文章目录 ThreadLocal 是什么&#xff1f;它的实现原理是什么&#xff1f; ThreadLocal 是什么&#xff1f;它的实现原理是什么&#xff1f; ThreadLocal 是一种线程隔离机制&#xff0c;它提供了多线程环境下对于共享变量访问的安全性。 在多线程访问共享变量的场景中&#…

mysql原理--Explain详解

1.概述 一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的 执行计划 &#xff0c;这个执行计划展示了接下来具体执行查询的方式&#xff0c;比如多表连接的顺序是什么&#xff0c;对于每个表采用什么访问方法来具体执行查询等等。设计 MySQL 的…