手机
当前位置:查字典教程网 >编程开发 >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之旅开始了)[八]

C语言中函数与指针的应用总结

基于VC编写COM连接点事件的分析介绍

利用C语言实践OOP,以及new,delete的深入分析

c语言中用位运算实现加法技巧介绍

C语言中字符串常用函数strcat与strcpy的用法介绍

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

c++中inline的用法分析

从汇编看c++中变量类型的深入分析

C++中抽象类和接口的区别介绍

精品推荐
分类导航