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 }