#include <stdio.h>
  • //演示sizeof对数据类型不加小括号
  • int main(int argc, char** argv)
  • {
  • int a = 0;
  • printf("sizeof int:%d \n", sizeof int);
  • return 0;
  • }
  • 复制代码

    这篇文章将详细接受啊sizeof关键字的使用。过这篇文章将学会看懂和使用sizeof关键字。

    sizeof的作用主要是计算C语言中数据类型或者变量的长度即变量所占的存储空间的大小。

    (1)sizeof是关键字不是函数

    这个一定要理解并记住。初学者往往搞不清。因为平时我们见到的sizeof几乎都是加上小括号来使用,比如int a[5] ;sizeof(a) 而函数的定义或者在使用时都有小括号,所以容易造成误解。那么sizeof后面是否都需要加上小括号里,在哪些情况下可以不用加?用代码来演示。

    #include <stdio.h>
  • //演示sizeof对变量和数据类型都加小括号
  • int main(int argc, char** argv)
  • {
  • int a = 0;
  • printf("sizeof(int):%d \n", sizeof(int));
  • printf("sizeof(a):%d \n", sizeof(a));
  • return 0;
  • }
  • 复制代码

    运行结果:

    forum.jpg


    如果将变量和数据类型的小括号都去掉呢?哪个会出错?


    运行结果:

    forum.jpg


    分析结果:出错,原因是在int前面缺少表达式。

    #include <stdio.h>
  • //演示sizeof对变量不加小括号
  • int main(int argc, char** argv)
  • {
  • int a = 0;
  • printf("sizeof a:%d \n", sizeof a);
  • return 0;
  • }
  • 复制代码

    运行结果:

    forum.jpg


    分析结果: sizeof a 和sizeof(a) sizeof(int)结果一样,都没有出错,说明sizeof不是函数,如果函数后面不叫小括号()则一定会出错。而sizeof int出错,说明在计算数据类型的长度时一定要加上小括号。因此为了防止人为出错,我们在编程时最好在使用sizeof的时候加上小括号。

    (2)sizeof计算基本数据类型的长度

    #include <stdio.h>
  • //演示sizeof计算基本数据类型的长度
  • int main(int argc, char** argv)
  • {
  • printf("char长度:%d \n", sizeof(char));
  • printf("short长度:%d \n", sizeof(short));
  • printf("int长度:%d \n", sizeof(int));
  • printf("long长度:%d \n", sizeof(long));
  • printf("float长度:%d \n", sizeof(float));
  • printf("double长度:%d \n",sizeof(double));
  • return 0;
  • }
  • 复制代码

    forum.jpg


    运行结果:

    forum.jpg


    分析结果:从中可以看到char占一个字节,short占2个字节,int和long占4个字节,float占4个字节,double占8个字节。注意这是在32位linux系统中的结果。为什么要测试类型的长度呢?一方面是为以后定义变量做出合适的选择,不要让变量的值超出了变量类型的范围(比如unsigned char的范围是0-255,);另一方面是面试,有些题目直接问int类型所占的内存空间,不要一口咬定是4个字节,因为在不同的系统中int的长度真不一样,自己可以试试。

    (3)sizeof与数组、指针的结合

    1)与指针结合

    #include <stdio.h>
  • //演示sizeof与指针的结合
  • int main(int argc, char** argv)
  • {
  • int *p = NULL;
  • char *p1 = NULL;
  • printf("sizeof(p):%d \n", sizeof(p));
  • printf("sizeof(p1):%d \n", sizeof(p1));
  • printf("sizeof(*p):%d \n", sizeof(*p));
  • printf("sizeof(*p1):%d \n", sizeof(*p1));
  • return 0;
  • }
  • 复制代码

    运行结果:

    forum.jpg


    分析结果:前2个结果都是4。为什么呢?定义p为int型指针,而p1为char型指针,类型不一样,结果反而一样。原因是在32位系统中,不论指针所指向是哪种数据类型(比如这里的int和char)规定指针就占4个字节。这一点,一定要记住。往往面试题会考。后2个结果为4和1,很简单。*p是整型值 *p1是字符值,长度就是4和1.所以sizeof对指针和指针进行解引用后所计算的长度是不一样的。

    2)与数组结合

    #include <stdio.h>
  • //演示sizeof与数组、指针的结合
  • int main(int argc, char** argv)
  • {
  • int a[50] ={0};
  • printf("sizeof(a[0]):%d \n", sizeof(a[0]));
  • printf("sizeof(a):%d \n", sizeof(a));
  • printf("数组a中元素的个数:%d \n", sizeof(a)/sizeof(a[0]));
  • printf("数组a中元素的个数:%d \n", sizeof(a)/sizeof(int));
  • return 0;
  • }
  • 复制代码

    forum.jpg


    运行结果:

    forum.jpg


    分析结果:代码中定义了一个有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与结构体的结合

    #include <stdio.h>
  • struct test
  • {
  • char c;
  • short s;
  • int a;
  • };
  • //演示sizeof与结构体结合
  • int main(int argc, char** argv)
  • {
  • struct test t = {'0', 255, 1024};
  • struct test *p = NULL;
  • printf("sizeof(t):%d \n", sizeof(t));
  • printf("sizeof(struct test):%d \n", sizeof(struct test));
  • printf("sizeof(p):%d \n", sizeof(p));
  • return 0;
  • }
  • 复制代码

    forum.jpg


    运行结果:

    forum.jpg


    分析结果:定义一个结构体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很常用,这些都是必须要掌握的,上机实战,理解才是王道。