对C语言中sizeof细节的三点分析介绍

 更新时间:2013年07月11日 11:35:50   作者:  
以下是对C语言中sizeof的细节进行了详细的分析介绍,需要的朋友可以参考下

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语言中accept()函数和shutdown()函数的使用

    详解C语言中accept()函数和shutdown()函数的使用

    这篇文章主要介绍了详解C语言中accept()函数和shutdown()函数的使用,用来操作socket相关的网络通信,需要的朋友可以参考下
    2015-09-09
  • C++使用map容器实现电子词典

    C++使用map容器实现电子词典

    这篇文章主要为大家详细介绍了C++如何使用map容器实现电子词典功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的小伙伴可以参考一下
    2022-11-11
  • C++设计模式之工厂方法模式

    C++设计模式之工厂方法模式

    这篇文章主要介绍了C++设计模式之工厂方法模式,它是对简单工厂模式的扩展,,需要的朋友可以参考下
    2014-09-09
  • C语言递归实现归并排序详解

    C语言递归实现归并排序详解

    这篇文章主要为大家详细介绍了C语言递归实现归并排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下, 希望能够给你带来帮助
    2022-03-03
  • C++超详细讲解内存空间分配与this指针

    C++超详细讲解内存空间分配与this指针

    this 指针在C++类和对象中是个很方便实用的关键字,可以简化对象成员属性的调用,使代码表达的含义更加准确;在之前的学习中我们都可以判断变量所占内存空间大小,那么我们创建的类对象所占的内存空间怎么计算呢?想知道this的妙用和类对象占用的内存空间就来跟我学习吧
    2022-05-05
  • 利用C语言实现2048小游戏的方法

    利用C语言实现2048小游戏的方法

    2048是比较流行的一款数字游戏,相信对大家来说都不陌生,这篇文章给大家分享了利用C语言实现2048小游戏的方法,对大家学习理解C语言具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。
    2016-10-10
  • 用C++的odeint库求解微分方程

    用C++的odeint库求解微分方程

    求解微分方程的数值解一般使用MATLAB等数值计算软件,其实C++也可以求解微分方程,需要用到odeint库,它是boost库的一部分。官方教程和示例比较晦涩,本文力求用较短的篇幅介绍它的基本用法,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • C++内存管理面经

    C++内存管理面经

    这篇文章主要介绍了C++的内存分配方式以及介绍了下栈和堆的区别,感兴趣的小伙伴可以参考阅读本文
    2023-03-03
  • C语言实现简易的三子棋游戏

    C语言实现简易的三子棋游戏

    这篇文章主要为大家详细介绍了C语言实现简易的三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++ OpenCV实现物体尺寸测量示例详解

    C++ OpenCV实现物体尺寸测量示例详解

    本文主要介绍了利用OpenCV对物体的尺寸进行测量,即先定位到待测物体的位置,然后测量物体的宽高。感兴趣的同学可以跟随小编一起学习学习
    2022-01-01

最新评论