zoukankan      html  css  js  c++  java
  • sizeof

      1 #include"iostream"
      2 using namespace std;
      3 //sizeof(foo(3)) 有参数时要有参数,否则不正确
      4 char foo(int a)
      5 {
      6     cout<<"这是一个foo函数。"<<endl;
      7     return 'a';
      8 }
      9 
     10 //sizeof p与sizeof(funn())与sizeof(funnn())有关指针类型的
     11 void fun(int *p)
     12 {
     13 
     14     cout<<"sizeof p="<<sizeof p<<endl;
     15 }
     16 char *funn()
     17 {
     18     char k[10]="jjjjj";
     19     char *p="kfkkfkf";
     20     cout<<"char *funn()"<<endl;
     21     return p;
     22 }
     23 void *funnn()
     24 {
     25     return NULL;
     26 }
     27 
     28 
     29 //有关数组参数的,就像指针一样
     30 void foo3(char a3[3])
     31 {
     32     int c3 = sizeof( a3 ); // c3 ==4
     33     cout<<"foo3(char a3[3])=sizeof(a3)="<<c3<<endl;
     34 
     35 }
     36 void foo4(char a4[])
     37 {
     38     int c4 = sizeof( a4 ); // c4 ==4
     39     cout<<"foo4(char a4[])=sizeof(a4)="<<c4<<endl;
     40 }
     41 //char a[10]() char a[](){}都是不行的,没有这样的定义函数
     42 //{
     43 //    char b[10]="1212121"
     44     //return b;
     45 //}
     46 
     47 //有关结构体的
     48 struct S1{
     49     
     50     int a;
     51     char c;
     52 
     53 };
     54 struct S2{
     55     char c;
     56     S1 s;
     57     char c2;
     58 };
     59 struct S3{
     60 
     61 };
     62 //联合体的
     63 union U1{
     64     char a;
     65     int b;
     66 };
     67 union U2{
     68     char a;
     69     
     70 };
     71 union U3{
     72     char a;
     73     S1 s;
     74     int c;
     75     
     76 };
     77 union U4{
     78 
     79 };
     80 void main()
     81 {
     82 
     83     /************************************************************************/
     84     /* (a++)-=(a++)
     85     带括号与不带括号是一样的*/
     86     /************************************************************************/
     87   //  int a=4;
     88 //    cout<<((++a)-=(a++))<<endl;//0 ++a a-=a a++;
     89     //cout<<a;//1
     90 
     91 
     92 
     93 /************************************************************************/
     94 /* char int float long double 的sizeof(?)的大小                                                                    */
     95 /************************************************************************/    
     96 //    int a;
     97 //    cout<<"sizeof(a)="<<sizeof(a)<<endl;//4
     98 //    cout<<"sizeof(int)="<<sizeof(int)<<endl;//4
     99 //    cout<<"sizeof(int b)="<<sizeof(int b)<<endl;//这样是不可以的
    100 //    cout<<"sizeof(float,long,double,char)="<<sizeof(char)<<endl;//4,4,8,1
    101 
    102 
    103 
    104     /************************************************************************/
    105     /* 有关函数调用的sizeof(foo())的大小   sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用
    106     C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值*/
    107     /************************************************************************/
    108 //    size_t sz=sizeof(foo(3));
    109 //    cout<<"sizeof(foo())="<<sz<<endl;//1但没有调用foo()函数
    110     //cout<<sizeof(void)<<endl;//这种是错误的
    111 
    112 
    113 /************************************************************************/
    114 /*有关函数参数指针时的sizeof及函数返回是指针类型的sizeof,还有void*funnn()的sizeof,其实都是数字的类型,结果是4                                                                      */
    115 /************************************************************************/    
    116 //    int a=10;
    117 //    fun(&a);//4
    118 //    cout<<"char *funn()=sizeof(funn())="<<sizeof(funn())<<endl;//4
    119 //    cout<<"void *funnn()=sizeof(funnn())="<<sizeof(funnn())<<endl;//4
    120 
    121 
    122 
    123     /************************************************************************/
    124     /* 有关数组的sizeof   
    125     也许当你试图回答c4的值时已经意识到c3答错了,是的,c3!=3。这里函数参数a3已不再是数组类型,而是蜕变成指针,
    126     相当于char* a3,为什么仔细想想就不难明白,我们调用函数foo1时,程序会在栈上分配一个大小为3的数组吗不会!
    127     数组是“传址”的,调用者只需将实参的地址传递过去,所以a3自然为指针类型(char*),c3的值也就为4。*/
    128     /************************************************************************/
    129     //char a1[]="abc";
    130     //char a2[10]="abc";
    131     //int b1[3];
    132     //cout<<"a1[]=sizeof(a1)="<<sizeof a1<<endl;//4   字符末尾还存在一个NULL终止符
    133     //cout<<"a2[]=sizeof(a2)="<<sizeof a2<<endl;//10  最大只有10个,这个是包括了末尾的终止符
    134     //cout<<"b1[]=sizeof(b1)="<<sizeof b1<<endl;//12   (依赖于int)
    135 
    136     //foo3(a2);//4    
    137     //foo4(a2);//4
    138 
    139 
    140 
    141 /************************************************************************/
    142 /* 结构体的sizeof 
    143 由于结构体的成员可以是复合类型,比如另外一个结构体,
    144 所以在寻找最宽基本类型成员时,应当包括复合类型成员的子成员,而不是把复合成员看成是一个整体。
    145 但在确定复合类型成员的偏移位置时则是将复合类型作为整体看待。     
    146  
    147    #pragma pack( n ),n为字节对齐数,其取值为1、2、4、8、16,默认是8,
    148 如果这个值比结构体成员的sizeof值小,那么
    149 该成员的偏移量应该以此值为准,即是说,结构体成员的偏移量应该取二者的最小值,
    150     
    151     还有一点要注意,“空结构体”(不含数据成员)的大小不为0,而是1。
    152     试想一个“不占空间”的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢于是,
    153     “空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了*/
    154 /************************************************************************/
    155 //S1 s;
    156 //S1 ss={'a',4};
    157 //cout<<"struct S1{}=sizeof(S1)="<<sizeof(S1)<<endl;//8 默认#pragma pack(n)n=8,由于int是4个字节,4<8,取最小=4,所以sizeof(S1)=4+4=8
    158 //cout<<"struct S1{}=sizeof(S1)="<<sizeof(s)<<endl;//8 只与类型有关
    159 //cout<<"struct S1{}=sizeof(S1)="<<sizeof(ss)<<endl;//8 只与类型有关
    160 //cout<<"struct S2{}=sizeof(S2)="<<sizeof(S2)<<endl;//16 默认#pragma pack(n)n=8,由于S1中有个int int是4个字节,4<8,取最小=4,所以sizeof(S1)=4+8+4=16
    161 //cout<<"struct S3{}=sizeof(S3)="<<sizeof(S3)<<endl;//1  还有一点要注意,“空结构体”(不含数据成员)的大小不为0,而是1。配一个字节的空间用于占位了
    162 //cout<<sizeof(long double)<<endl;//8为了测试一下大于8的,但没有大于8.
    163 
    164 
    165 /************************************************************************/
    166 /*联合体的sizeof    
    167     结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以整个联合体的sizeof也就是每个成员sizeof的最大值。
    168     结构体的成员也可以是复合类型,这里,复合类型成员是被作为整体考虑的。*/
    169 /************************************************************************/
    170     cout<<"union U1=sizeof(U1)="<<sizeof U1<<endl;//4
    171     cout<<"union U2=sizeof(U2)="<<sizeof U2<<endl;//1
    172     cout<<"union U3=sizeof(U3)="<<sizeof U3<<endl;//8
    173     cout<<"union U4=sizeof(U4)="<<sizeof U4<<endl;//1
    174 
    175     //对 这个有点好奇。嘻嘻
    176     char p[]="a
    ";
    177     cout<<sizeof p<<"  "<<strlen(p)<<endl;//3 2
    178     char p1[]="an";
    179     cout<<sizeof p1<<"  "<<strlen(p1)<<endl;//4 1
    180     char p2[]="a+n";
    181     cout<<sizeof p2<<"  "<<strlen(p2)<<endl;//4 3
    
    182     char p3[]="a\n";
    183     cout<<sizeof p3<<"  "<<strlen(p3)<<endl;//4 3
    184     char p4[]="a/n";
    185     cout<<sizeof p4<<"  "<<strlen(p4)<<endl;//4 3
    186 
    187 }
    View Code
  • 相关阅读:
    Spring总结四:IOC和DI 注解方式
    Spring总结二:IOC(控制反转)xml方式
    Spring总结一:Srping快速入门
    TCP UDP HTTP 的关系和区别
    sql 一些偶尔会用到的写法和函数 不定时更新
    AngularJS分层开发
    AngularJS入门
    url和uri的区别
    MyBatis总结八:缓存介绍(一级缓存,二级缓存)
    Javascript 中 == 与=== 对比
  • 原文地址:https://www.cnblogs.com/yyy88168/p/3235038.html
Copyright © 2011-2022 走看看