手机
当前位置:查字典教程网 >编程开发 >C语言 >对C语言中sizeof细节的三点分析介绍
对C语言中sizeof细节的三点分析介绍
摘要:1.sizeof是运算符,跟加减乘除的性质其实是一样的,在编译的时候进行执行,而不是在运行时才执行。那么如果编程中验证这一点呢?ps:这是前...

1.sizeof是运算符,跟加减乘除的性质其实是一样的,在编译的时候进行执行,而不是在运行时才执行。

那么如果编程中验证这一点呢?ps:这是前两天朋友淘宝面试的一道题,小编理解:

复制代码 代码如下:

#include<iostream>

using namespace std;

int main()

{

int i=1;

cout<<i<<endl;

sizeof(++i);

cout<<i<<endl;

return 1;

}

输入结果为 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后的地址减去之前的地址,得到的差值就是数组本身所占的字节大小。

【对C语言中sizeof细节的三点分析介绍】相关文章:

C++中的单例模式介绍

基于C语言char与unsigned char的区别介绍

c语言:基于函数指针的两个示例分析

C++中关于Crt的内存泄漏检测的分析介绍

C++中的对象数组详细解析

C语言中打印特殊图案的实现代码

c语言中return与exit的区别浅析

基于c语言知识点的补遗介绍

C语言宏定义使用分析

C 语言基础教程(我的C之旅开始了)[八]

精品推荐
分类导航