sizeof

来源:互联网 发布:鞍山plc编程培训 编辑:程序博客网 时间:2024/05/16 12:13
今天特别学习了下sizeof。整理了下。效率不高。 为了能巩固,下次写另一个。完成的时候,。再看这复习一次。毕竟平时用的不多。容易生疏。也是因为没有发掘出原理吧
 
语法:
    sizeof(类型说明符,数组名,表达式)
    返回在内存中所占的字节数
    一般不会对表达式进行计算。而根据结果类型确定大小
1.基本数据类型的sizeof,   char 1 ,int 4

2.指针的sizeof 为 4(32位系统下)

3.数组的sizeof, 是整个数组的字节数
 int a[10]
sizeof( a )   =  sizeof( int ) *10    //是整个数组的字节数
sizeof( a[15] ) = sizeof( int )    //和下标无关

int b[2][3]
sizeof( b ) = sizeof( int ) *3 *2 = 24
sizeof( b[5] ) = sizeof( int ) *3 =12    //存放的相当于 一个一维数组的数组名 。因而获取的和一维数组一样。不是指针大小
sizeof( b[5][5]) = sizeof( int ) = 4
sizeof(&b) = 4  
sizeof(&b[2]) = 4  

这里发现数组名很神奇。。
之前的印象是。数组名就是指向数组首地址的指针。
而确实在大部分情况下可以把 数组名当成 指向数组首地址的指针来使用,不过不能对它进行修改
但是。如果他的类型是指针的话。为什么sizeof(数组名) 得出来的却是整个数组存放的字节大小(应该是 指针大小呀 = 4)
所以。数组名 不完全等同于 指针
那有什么区别呢?
1.数组名有指针常量的属性。不能修改
2.直接使用数组名的时候。会带有数组的信息(如sizeof),而转换成普通的指针后~只是带有4个字节的整数

特别的:
 当数组作为形参传入函数时:
    一维数组:    int a[] = int *
    二维数组:    a[][3] = (*a)[3]    // 特别的: 二维数组传递的时候 必须要 指明 列的个数(每个小数组(一行)的元素个数)
    同时,数组名类型 真正变为指针。不再带有数组的大小信息。只是普通的指针
//测试过程中发现:
char a[2][3] = {"aa","bb"}; 关于这种定义方式,等于  {{'a','a','\0'},{'b','b','\0'}} 

对于动态数组
int *p =new int[10];
 cout<<sizeof(p)<<endl;  p仍然只是一个普通的指针。说明sizeof确实是在编译时就计算的

4. struct 的sizeof
    特别注意 会自动 字节对齐。调整成员所占的空间
    1.和最宽的数据类型字节数对齐(相邻的,想家不足对齐字节数的。会压缩在一起),除非用特殊指令设置 对齐字节数
    2.空结构体占1位
    3.相邻的位域字段可能会压缩成一个(非位域字段穿插在其中,则不会压缩)

    特别的: struct 嵌套 struct,算对齐字节的时候,是把嵌套struct里面的数据类型拿出来一起比较的。
                    并且struct 里面的数组 也是拆分开的.如: char a[10] 看成 char a0; char a1....................a10
                    所以这个情况下 对数组取对齐字节的时候。只取数组元素类型。而取空间类型时。类型大小*元素个数  

5.Union 的sizeof
    成员中,取类型的最大值就是了。不用累计。因为没用过。不了解Union和struct的区别

6. 函数的sizeof
    即函数返回值 类型的sizeof



0 0
原创粉丝点击