MSDN上sizeof的解释:Thesizeof operator gives the amount of storage, in bytes, required to store an object of the type of the operand(sizeof运算给出的存储量,以字节为单位来存储操作数的类型的对象必需的。)
简单的说其实sizeof()的作用:返回一个对象或者类型所占的内存字节数。
float 4 个字节 double 8个字节
short 2 个字节 long 4个字节
long long 8个字节
指针: 指针是来存放地址的,那么它当然等于计算机内部地址总线的宽度。在32位计算机中,一个指针变量的返回值必定是4个字节。指针变量的sizeof值与指针所指的对象没有任何关系。
实际上,sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的
不同对象其sizeof值都是一致的。这里,对象可以进一步延伸至表达式,即sizeof可以
对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式
进行计算。如:
sizeof( 2 );// 2的类型为int,所以等价于 sizeof( int );
sizeof( 2 + 3.14 ); // 3.14的类型为double,2也会被提升成double类型,所以等价于 sizeof( double );
不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用
<span style="font-size:18px;"><span style="font-size:14px;">void fun1()
{
}
int fun()
{
return 1;
}
struct F
{
unsigned int f1 : 1;
int na;
};
int main()
{
printf("%d",sizeof(fun)); //错误 sizeof 的操作数不能是函数
printf("%d", sizeof(fun())); //正确 输出 4
printf("%d", sizeof(fun1())); //错误 不允许使用不完整的类型
printf("%d", sizeof(F.na)); //错误 未定义的标示符"F"
system("pause");
return 0;
}</span></span>
文章的重点内容来了 : 数组中的 sizeof()
数组的sizeof值等于数组所占用的内存字节数。 :
注意::不可以在自定义函数(带数组参数)中用sizeof 求数组的大小
在所有使用数组名的表达式中,数组名的值是一个指针常量(注意不是指针变量),也就是数组第1个元素的地址。
在两种情况下,数组名不用指针常量来表示(表示整个数组的地址)——当数组名作为sizeof操作符或单目操作符&的操作数。
一维数组:
<span style="font-size:18px;">// 数组名表示整个数组: 只有在sizeof 中单独使用 与 &操作符使用
char a[4] = {'1','2','3','4'};
printf("%d\n",sizeof(a)); // 4 a代表整个数组 , 数据类型char 的大小* 数组大小
printf("%d\n", sizeof(a+0)); // 4 a降级使用 表示首元素的地址, 地址 的大小 就是4 个字节
printf("%d\n", sizeof(*a)); // 1 a降级使用 表示首元素的地址 *解引用 表示第一个元素‘1’
printf("%d\n", sizeof(a+1)); // 4 a降级使用 表示首元素的地址, +1表示以前面的标准(一个元素)
// <span style="font-size:24px;"><span style="font-family:SimSun"></span></span>
// 向后移一位 此时表示第二个元素的地址地址的大小就是4 个字节
<span style="font-size:24px;"><span style="font-family:SimSun"></span></span>
printf("%d\n", sizeof(a[1])); // 1 表示第一个元素‘1’ char类型 所以 大小为1
printf("%d\n", sizeof(&a)); // 4 &表示取地址 相当于指针 所以大小为4
// 注意: 此时 a 表示整个数组 ,所以 此时的地址为整个数组的地址
printf("%d\n", sizeof(&a+1)); // 4 此时 a 表示整个数组 ,&a 表示整个数组的地址
// +1 表示以前面的标准(整个数组) 向后移一位,此时地址为下一个数组的地址
printf("%d\n", sizeof(&a[0])); // 4 表示第一个元素的地址
printf("%d\n", sizeof(&a[0]+1)); // 4 +1 表示以前面的标准(一个元素) 向后移一位
//此时表示第二个元素的地址</span>
二维数组 :
数组名表示整个数组: 只有在sizeof 中单独使用 或者和&操作符使用
数组名参与运算要发生降级 比如说a[0] a[1]也表示数组名 ,此时表现为一维数组
<span style="font-size:18px;"> // 数组名表示整个数组:只有在sizeof 中单独使用 或者 和&操作符使用
// 数组名参与运算要发生降级 比如说a[0] a[1] 也表示数组名
char a[2][3] = { '1','2','3','4','5','6',};
printf("%d\n",sizeof(a)); // 6 a表示整个数组 大小为 6
printf("%d\n", sizeof(a+1)); // 4 a参与运算 降级使用 表示第一行的地址,
<span style="font-size:24px;"><span style="font-family:SimSun"></span></span>
<span id="transmark"></span>// +1表示以前面的标准(一行元素)向后移一位so表示第二行的元素的地址
<span style="font-size:24px;"><span style="font-family:SimSun"></span></span>
printf("%d\n",sizeof(a[0])); // 3 a[0] 表示第一行 相当于一位数组的数组名
printf("%d\n",sizeof(a[0]+1)); // 4 a[0]参与运算 降级使用成为a[0][0]
// +1表示以前面的标准(一个元素) 向后移一位 所以表示a[0][1]的地址
printf("%d\n",sizeof(&a[0]+1)); // 4 &a[0] 表示第一行的地址
// +1表示以前面的标准(一行元素)向后移一位所以表示为第二行的地址
printf("%d\n",sizeof(*a)); // 3 a参与运算 降级使用 成为 第一行 的地址
// *解引用表示第一行(三个元素) 的大小 所以为3
printf("%d\n",sizeof(a[2])); // 3 a[2] 越界但是不影响 <span id="transmark"></span>相当于一维数组的数组名 表示第三行的大小 </span><span id="transmark"></span>