c语言 数组中的sizeof()
来源:互联网 发布:淘宝店一件代发赚钱么 编辑:程序博客网 时间:2024/04/30 20:45
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())); //正确 输出 4printf("%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表示整个数组 大小为 6printf("%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参与运算 降级使用 成为 第一行 的地址 // *解引用表示第一行(三个元素) 的大小 所以为3printf("%d\n",sizeof(a[2])); // 3 a[2] 越界但是不影响 <span id="transmark"></span>相当于一维数组的数组名 表示第三行的大小 </span><span id="transmark"></span>
- c语言 数组中的sizeof()
- c语言中的数组sizeof和strlen
- C语言中的sizeof
- C语言中的sizeof
- c语言中的sizeof()
- C语言中的sizeof
- C语言中的sizeof
- C语言中的sizeof()
- C语言字符数组sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 面试题6:重建二叉树(根据前序遍历和中序遍历)
- C# Winform跨线程设置button的visibility
- [译]NGINX 和 ZooKeeper,动态负载平衡和部署(上)
- ARM9 mini2451裸机学习——LCD学习(1)
- java Map及Map.Entry详解
- c语言 数组中的sizeof()
- netbeans for php 最常用快捷键整理
- Spring boot 整合CXF开发web service
- 真正的自动化测试
- 问题小结
- 动态规划简单理解
- A^B取后三位
- 143. Reorder List
- netbeans快捷键