发表时间:2017-04-26来源:网络
C语言中sizeof是什么意思 c语言里sizeof怎样用法详解 sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数。返回值类型为size_t,在头文件stddef.h中定义
这是一个依赖于编译系统的值,一
般定义为typedef unsigned int size_t;编译器林林总总,但作为一个规范,都会保证char、signed
char和unsigned char的sizeof值为1,毕竟char是编程能用的最小数据类型。
MSDN上的解释为:
The sizeof keyword gives the amount of storage, in bytes, associated with avariable or a
type (including aggregate types). This keyword returns a value of type
size_t.
2. 语法:
sizeof有三种语法形式,如下:
1) sizeof( object ); // sizeof( 对象 );
2) sizeof( type_name ); // sizeof( 类型 );
3) sizeof object; // sizeof 对象;
所以一下三种sizeof的使用都是对的
复制代码 代码如下:
#include <stdio.h>
main()
{
int b;
printf("%dn",sizeof b);
printf("%dn",sizeof(b));
printf("%dn",sizeof(int));
}
4. 基本数据类型的sizeof
这里的基本数据类型指short、int、long、float、double这样的简单内置数据类型,由于它们都是和系
统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注意,尽量不要在
这方面给自己程序的移植造成麻烦。一般的,在32位编译环境中,sizeof(int)的取值为4。
5. 指针变量的sizeof
等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4(注意结果是以
字节为单位),可以预计,在将来的64位系统中指针变量的sizeof结果为8。
指针变量的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等,所以
MFC消息处理函数使用两个参数WPARAM、LPARAM就能传递各种复杂的消息结构(使用
指向结构体的指针)。
6. 数组的sizeof
数组的sizeof值等于数组所占用的内存字节数,如:
char a1[] = "abc";
int a2[3];
sizeof( a1 ); // 结果为4,字符 末尾还存在一个NULL终止符
sizeof( a2 ); // 结果为3*4=12(依赖于int)
sizeof当作了求数组元素的个数是不对的,求数组元素的个数有下面两种写法:int c1 = sizeof( a1 )
/ sizeof( char ); // 总长度/单个元素的长度
int c2 = sizeof( a1 ) / sizeof( a1[0] ); // 总长度/第一个元素的长度.注意数组名做函数参数传递
时退化为指针。
7. 结构体的sizeof
struct S1
{
char c;
int i;
};
sizeof的结果等于对象或者类型所占的内存字节数,好吧,那就让我们来看看S1的内存分配情况:S1 s1
= { 'a', 0xFFFFFFFF };s1的地址为0x0012FF78,其数据内容如下:
0012FF78: 61 CC CC CC FF FF FF FF中间夹杂了3个字节的CC看看MSDN上的说明:When applied to a
structure type or variable, sizeof returns the actual size, which may
include padding bytes inserted for alignment.
这就是字节对齐!为什么需要字节对齐计算机组成原理教导我们这样有助于加快计算机的取数速度,否则
就得多花指令周期了。为此,编译器默认会对结构体进行处理(实际上其它地方的数
据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本
数据类型(int等)都位于能被4整除的地址上,以此类推。这样,两个数中间就可能
需要加入填充字节,所以整个结构体的sizeof值就增长了。
1.sizeof是运算符,跟加减乘除的性质其实是一样的,在编译的时候进行执行,而不是在运行时才执行。
那么如果编程中验证这一点呢?
复制代码 代码如下:
<SPAN style="FONT-SIZE: 18px">#include<iostream></SPAN><SPAN style="FONT-SIZE: 14px">
using namespace std;
int main()
{
int i=1;
cout<<i<<endl;
sizeof(++i);
cout<<i<<endl;
return 1;
}</SPAN>
输入结果为 1
1
sizeof 中的++i 的副作用并没有显示出来,原因只可能有一个,在编译的时候sizeof执行以后将++i 处理了,++i 的副作用因此被消除了。如果sizeof 是在运行时进行的话,则肯定要注意++i 。实际上sizeof的实现应该是用宏来做的,宏在编译时进行执行。具体实现可以参考下面。
2.sizeof('a')在C语言中的结果是4,在C++中结果是1,看过某篇文章说C中sizeof侧重于“数”,而C++中sizeof更侧重于“字符”。
3.文章中讲了两个用宏实现sizeof的经典应用
复制代码 代码如下:
//适用于非数组
#define _sizeof(T) ((size_t)((T*)0 + 1))
//适用于数组
#define array_sizeof(T) ((size_t)(&T+1)-(size_t)(&T))
先举两个小例子说明两个宏的应用,对于第一个如 _sizeof(int); 的结果就是4;对于第二个先声明一个大小为4的数组int a[4];那么array_sizeof(a)结果为16.
对于非数组的宏定义,先是将0转换为T*类型的指针所指向的地址(此时地址为0)。然后对T类型的地址加1,相当于加上了T类型的大小(即得到了非数组T的大小)。前面的size_t只是将地址转化为int型的整数返回。
一个简单的例子:int* p; p=p+1; --------p是一个int*类型的指针, p+1在地址空间上相当于加上了4个字节。
对 于数组的宏定义,类似于非数组的宏定义,为了方便理解,这里可以把数组T看成一个用户自定义的类型,&T表示数组类型的指针,对于数组类型指针加 1相当于在地址上加上了该数组大小。由于是用户自定义的类型所以不能强制将0转化为数组类型的地址,只能用加1后的地址减去之前的地址,得到的差值就是数 组本身所占的字节大小。
CI框架连接数据库配置操作以及多数据库操作
asp 简单读取数据表并列出来 ASP如何快速从数据库读取大量数据
C语言关键字及其解释介绍 C语言32个关键字详解
C语言中sizeof是什么意思 c语言里sizeof怎样用法详解
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
PHP中的魔术方法 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep,
PHP中include和require区别之我见
PHP中的(++i)前缀自增 和 (i++)后缀自增
将视频设置为Android手机开机动画的教程
php递归返回值的问题
掌上小满app(又名OKKI)下载v6.24.2 安卓版
108.1M |商务办公
星巴克中国官方版app下载v10.9.3 安卓版
138.0M |生活服务
abc reading app手机版下载v7.3.35 安卓最新版本
218.9M |学习教育
智慧联想摄像头app(更名智享家)下载v4.1.6.2 安卓最新版本
211.4M |生活服务
星通货主app下载v902 安卓版
142.5M |生活服务
火花思维官方版下载v2.1.1 安卓手机版
208.6M |学习教育
火山小视频极速版2025(改名抖音火山版)下载v33.4.0 安卓官方正版
248.5M |影音播放
泰州通app下载v2.2.2 安卓版
126.9M |商务办公
2014-09-05
2022-03-17
2014-09-05
2014-09-05
2015-07-05
2022-03-21
2014-09-05
2014-09-05
2022-03-20
2014-09-05
奇迹觉醒手游官方版下载v16.3.0 安卓正版
其它手游全民奇迹2官方版下载v14.0.0 安卓最新版
其它手游光遇虫虫助手版下载v0.13.9 安卓版
休闲益智剑侠世界3手游官方正版下载v1.6.24425 安卓版
角色扮演汽车城宝宝巴士游戏(改名为宝宝汽车城市)下载v9.86.00.01 安卓版
其它手游宝宝汽车城市游戏下载v9.86.00.01 安卓最新版
其它手游fifaonline4官方移动端最新版本(足球在线4移动版)下载v1.2503.0005 安卓版
体育运动腾讯欢乐麻将全集ios版下载v1.0.4 iphone官方版
其它手游龙之谷2手游官方版下载v1.53.2 安卓最新版
角色扮演