Chinaunix首页 | 论坛 | 博客
  • 博客访问: 670112
  • 博文数量: 150
  • 博客积分: 4070
  • 博客等级: 中校
  • 技术积分: 1795
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-23 21:44
文章分类

全部博文(150)

文章存档

2012年(1)

2011年(123)

2010年(26)

分类: C/C++

2010-12-26 11:21:18

1. sizeof不是一个函数,它是在编译阶段求值的;
 
2. 这里有个陷阱,看下面的程序:
int a = 0;
cout<cout<
输出为什么是4,0而不是期望中的4,3???就在于sizeof在编译阶段处理的特性。由于sizeof不能被编译成机器码,所以sizeof作用范围内,也就是()里面的内容也不能被编译,而是被替换成类型。=操作符返回左操作数的类型,所以a=3相当于int,而代码也被替换为:
int a = 0;
cout<<4<cout<
 
3. sizeof的用法

  sizeof有两种用法:

  (1)sizeof(变量)

  (2)sizeof(类型)
 
4. 数据类型的sizeof,这是根据机器的位长来决定;
 
5. 不管什么类型的指针,sizeof的值都是4
 
6. 数组的sizeof
考虑下面问题:

char a[] = "abcdef";
int b[20] = {3, 4};
char c[2][3] = {"aa", "bb"};

cout<cout<cout<
 
数组a的大小在定义时未指定,编译时给它分配的空间是按照初始化的值确定的,也就是7。c是多维数组,占用的空间大小是各维数的乘积,也就是6。可以看出,数组的大小就是他在编译时被分配的空间,也就是各维数的乘积*数组元素的大小。

结论:数组的大小是各维数的乘积*数组元素的大小。

这里有一个陷阱:

int *d = new int[10];
cout<

d是我们常说的动态数组,但是他实质上还是一个指针,所以sizeof(d)的值是4。
 
再考虑下面的问题:

double* (*a)[3][6];
cout<cout<cout<cout<cout<

a是一个很奇怪的定义,他表示一个指向 double*[3][6]类型数组的指针。既然是指针,所以sizeof(a)就是4。
既然a是执行double*[3][6]类型的指针,*a就表示一个double*[3][6]的多维数组类型,因此sizeof(*a)=3*6*sizeof(double*)=72。同样的,**a表示一个double*[6]类型的数组,所以sizeof(**a)=6*sizeof(double*)=24。***a就表示其中的一个元素,也就是double*了,所以sizeof(***a)=4。至于****a,就是一个double了,所以sizeof(****a)=sizeof(double)=8。
 
7. 类的sizeof大小
一个空类所占用的空间为1,多重继承的空类所占空间也是1
 
8. 枚举常量不会占用对象的存储空间,如有以下定义
class stu
{
    enum  week{sun, mod, tue};
};
 
stu T;
cout<
cout<
 
 
 
 
 
 
 
 
 

阅读(1052) | 评论(1) | 转发(0) |
0

上一篇:const的用途

下一篇:内联函数与宏定义

给主人留下些什么吧!~~

chinaunix网友2010-12-30 14:08:50

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com