0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言的sizeof操作符基础和经典问题

汽车玩家 来源:嵌入式大杂烩 作者:嵌入式大杂烩 2020-04-04 17:39 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

sizeof基础

C语言中,sizeof是一个操作符(operator),而不是函数!其用于判断数据类型或者表达式长度(所占的内存字节数)。其有两种表达形式:

(1)sizeof(类型说明符)

(2)sizeof 表达式

我们通常使用第(1)种形式。

其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为:

typedef unsigned int size_t;

首先确定我们当前编译环境中C语言各个基本数据类型在内存中所占字节数,我这里是32bit编译环境:

C语言的sizeof操作符基础和经典问题

我们这里的输出结果为:

C语言的sizeof操作符基础和经典问题

sizeof典型问题

sizeof看起来似乎很简单,那来看看下面这段代码,你能做对几个:

C语言的sizeof操作符基础和经典问题

实际运行 输出结果为:

C语言的sizeof操作符基础和经典问题

简要分析:

(1)sizeof(char) 的值为1。因为char类型数据在内存中占1字节。

(2)sizeof(char*)的值为4。因为char*代表一个指针,在32bit环境中为4字节,也即unsigned int的字节长度。

(3)sizeof('a')的值为4。因为此处‘a’是独立存在的一个字符(没有赋值给其它变量),实际上就是一个整型数,占4个字节,即此处‘a’对应的ascii码的十进制为整数97。但是需要注意的是,若有如下定义:

char ch = 'a';

则此处ch的字节数sizeof(ch)的值为1,而不是4。

(4)sizeof(*s+0)的值为4,因为'h'+0 转化为int,占4字节。此处涉及到类型转换的问题。即不同类型的数据进行运算时,会首先转换成相同数据类型。转换规则为(图片来源于网络):

C语言的sizeof操作符基础和经典问题

(5)sizeof(*s)的值为1,因为此处*s为字符串s的第1个字符‘h’(注意与第三点区分开来,这里是有用char来修饰的),所以所占字节长度为1。

(6)sizeof(s)的值为4,同(2),此处s是一个指针,在32bit环境中为4字节,也即unsigned int的字节长度。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    9

    文章

    3238

    浏览量

    76529
  • C语言
    +关注

    关注

    183

    文章

    7646

    浏览量

    146204
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言重点—指针篇

    C语言是比较偏底层的语言,为什么他比较偏底层,就是因为他的很多操作都是直接针对内存操作的。 这篇我们就来讲解
    发表于 01-22 08:23

    C语言指针p、*p、&p、*&p、&*p分别代表什么

    * p和 *p又代表什么吗? 写个测试程序下面是一个简单的C语言代码,可以用来演示上面提到的几个标识,让我们更好的理解几个标识的意义: #include int main() {
    发表于 01-07 07:34

    C语言主要特点

    ,源程序短,因此输入程序时工作量少。 2.运算丰富,C语言的运算包含的范围很广泛,共有34种运算
    发表于 01-05 07:41

    C语言嵌入式系统编程注意事项-内存操作

    C语言嵌入式系统编程注意事项之内存操作 在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的
    发表于 01-04 07:31

    如何在TensorFlow Lite Micro中添加自定义操作符(1)

    相信大家在部署嵌入式端的AI应用时,一定使用过TensorFlow Lite Micro,以下简称TFLm。TFLm 是专为微控制器和嵌入式设备设计的轻量级机器学习推理框架,它通过模块化的操作符系统
    的头像 发表于 12-26 10:34 5832次阅读

    C语言经典问题及解析

    (\"> 6\") : puts(\"<= 6\"); } 考察点: 这 个问题测试你是否懂得C语言中的整数自动转换原则,我发现有
    发表于 12-23 07:52

    布尔表达式和零值比较处理

    ==0,x!=0(或者x>0)。 C代码中每次关系运算的调用,编译器都会发出一个比较指令。 如果操作符是上面提到的,编译器便会优化掉比较指令。例如: int aFunction
    发表于 12-12 06:16

    C语言C++之间的区别是什么

    函数重载,即在同一作用域内可以定义多个同名函数,只要它们的参数列表不同即可。 C语言不支持函数重载,每个函数必须具有唯一的标识。 4、异常处理: C++内置了异常处理机制,允许程
    发表于 12-11 06:23

    C语言的常量介绍

    、-13; 实型常量:13.33、-24.4; 字符常量:‘a’、‘M’ 字符串常量:”I love china!” 在C语言中,可以用一个标识来表示一个常量,称之为符号常量。符号常量在使用之前必须先
    发表于 11-24 07:12

    C语言特性

    1、高效性:直接操作硬件 C 语言代码的执行效率极高,这是其最为显著的优势之一。它能够直接访问硬件资源,与底层硬件进行紧密交互,充分发挥硬件的性能潜力。在嵌入式开发中,硬件资源往往十分有限,对程序
    发表于 11-24 07:01

    C语言操作符

    C 语言操作符包括按位与( )、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。 按位与( ) 只有当两个二进制位
    发表于 11-21 07:52

    C语言宏拼接运算典型使用

    C语言中,##运算(称为[size=16.002px]标记拼接运算)用于宏定义中将两个标记(token)拼接成一个新的标记。它在预处理阶段处理,常用于动态生成变量名、函数名或类型
    发表于 11-20 08:27

    C语言和单片机C语言有什么差异

    语言的功能特性外,它可以很好的操作底层的硬件接口。在C语言的基础上,如果你把一些单片机的端口或特殊功能寄存器加于定义,使用的时候会更加方便,写语句的时候,直接直观的编写。这样就差不多是
    发表于 11-14 07:55

    C语言的printf基本用法介绍

    也是代码的一部分,但是它并不会给程序带来任何影响,编译器在编译阶段会忽略注释的内容,或者说删除注释的内容。我在《C语言标识、关键字和注释》一节中做了详细讲解。 3) money 的输出值并不是
    发表于 11-12 07:04

    第4章 C语言基础以及流水灯的实现(4.3 4.4)

    的符号分别是:+、-、*、/、%。 C语言有一个很重要的赋值运算“=”,前边程序有使用过。在C语言里,“=”代表的意思是赋值,而不是等于。
    的头像 发表于 10-29 15:30 447次阅读