这篇文章将详细接受啊sizeof关键字的使用。过这篇文章将学会看懂和使用sizeof关键字。
sizeof的作用主要是计算C语言中数据类型或者变量的长度即变量所占的存储空间的大小。
(1)sizeof是关键字不是函数
这个一定要理解并记住。初学者往往搞不清。因为平时我们见到的sizeof几乎都是加上小括号来使用,比如int a[5] ;sizeof(a) 而函数的定义或者在使用时都有小括号,所以容易造成误解。那么sizeof后面是否都需要加上小括号里,在哪些情况下可以不用加?用代码来演示。
运行结果:
如果将变量和数据类型的小括号都去掉呢?哪个会出错?
运行结果:
分析结果:出错,原因是在int前面缺少表达式。
运行结果:
分析结果: sizeof a 和sizeof(a) sizeof(int)结果一样,都没有出错,说明sizeof不是函数,如果函数后面不叫小括号()则一定会出错。而sizeof int出错,说明在计算数据类型的长度时一定要加上小括号。因此为了防止人为出错,我们在编程时最好在使用sizeof的时候加上小括号。
(2)sizeof计算基本数据类型的长度
运行结果:
分析结果:从中可以看到char占一个字节,short占2个字节,int和long占4个字节,float占4个字节,double占8个字节。注意这是在32位linux系统中的结果。为什么要测试类型的长度呢?一方面是为以后定义变量做出合适的选择,不要让变量的值超出了变量类型的范围(比如unsigned char的范围是0-255,);另一方面是面试,有些题目直接问int类型所占的内存空间,不要一口咬定是4个字节,因为在不同的系统中int的长度真不一样,自己可以试试。
(3)sizeof与数组、指针的结合
1)与指针结合
运行结果:
分析结果:前2个结果都是4。为什么呢?定义p为int型指针,而p1为char型指针,类型不一样,结果反而一样。原因是在32位系统中,不论指针所指向是哪种数据类型(比如这里的int和char)规定指针就占4个字节。这一点,一定要记住。往往面试题会考。后2个结果为4和1,很简单。*p是整型值 *p1是字符值,长度就是4和1.所以sizeof对指针和指针进行解引用后所计算的长度是不一样的。
2)与数组结合
运行结果:
分析结果:代码中定义了一个有50个元素的整型数组a。a[0]表示低1个数据,因为类型是int,所以结果为4.sizeof(a)表示整个数组中元素的大小:50个元素*每个元素的长度为4=200。计算数组中元素的个数非常重要,不用自己算,让计算机帮我们计算。有2种方法 sizeof(a)/sizeof(a[0])和sizeof(a)/sizeof(int),建议用sizeof(a)/sizeof(a[0])因为这是一种通用形式,与特定的数组类型无关。开发中也经常用到,也是面试常考点。
(4)sizeof与结构体的结合
运行结果:
分析结果:定义一个结构体struct test,按前面的介绍char、short、int分别占1,2,4个字节,那么结果应该是1+2+4=7,为什么结果为8?这是C语言中的结构字节对齐,实际上char后面空了一个字节的位置来进行填充。最后一个结果为4的原因是计算的是指针的长度,前面有讲过。这里不打算对字节对齐详细说,在结果题专题中会详细讲。在这里主要是要注意sizof在计算结构体的长度时要考虑字节对齐。
(5)与malloc结合
常常在研发中会用到动态申请内存。比如需要申请50个整型元素,可以这样做
int *p = NULL; p = (int *)(sizeod(int) * 50);
以上就是所总结的sizeof的用法,sizeof很常用,这些都是必须要掌握的,上机实战,理解才是王道。