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
原文地址:https://www.cnblogs.com/yyy88168/p/3235038.html