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 //对\0 这个有点好奇。嘻嘻 176 char p[]="a\n"; 177 cout<<sizeof p<<" "<<strlen(p)<<endl;//3 2 178 char p1[]="a\0n"; 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 }