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

2024-01-01 18:44

本文主要是介绍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那么如果觉得有用的话,就点个赞支持一下吧。

这篇关于C语言之sizeof详解,5点透析,帮你真正了解它的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/560160

相关文章

Redis中的Lettuce使用详解

《Redis中的Lettuce使用详解》Lettuce是一个高级的、线程安全的Redis客户端,用于与Redis数据库交互,Lettuce是一个功能强大、使用方便的Redis客户端,适用于各种规模的J... 目录简介特点连接池连接池特点连接池管理连接池优势连接池配置参数监控常用监控工具通过JMX监控通过Pr

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

MySQL 存储引擎 MyISAM详解(最新推荐)

《MySQL存储引擎MyISAM详解(最新推荐)》使用MyISAM存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要... 目录mysql 5.5 之前默认的存储引擎️‍一、MyISAM 存储引擎的特性️‍二、MyISAM 的主

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

mybatis的mapper对应的xml写法及配置详解

《mybatis的mapper对应的xml写法及配置详解》这篇文章给大家介绍mybatis的mapper对应的xml写法及配置详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录前置mapper 对应 XML 基础配置mapper 对应 xml 复杂配置Mapper 中的相

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务

MySQL表空间结构详解表空间到段页操作

《MySQL表空间结构详解表空间到段页操作》在MySQL架构和存储引擎专题中介绍了使用不同存储引擎创建表时生成的表空间数据文件,在本章节主要介绍使用InnoDB存储引擎创建表时生成的表空间数据文件,对... 目录️‍一、什么是表空间结构1.1 表空间与表空间文件的关系是什么?️‍二、用户数据在表空间中是怎么

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

python3 pip终端出现错误解决的方法详解

《python3pip终端出现错误解决的方法详解》这篇文章主要为大家详细介绍了python3pip如果在终端出现错误该如何解决,文中的示例方法讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下... 目录前言一、查看是否已安装pip二、查看是否添加至环境变量1.查看环境变量是http://www.cppcns