C语言:sizeof运算符(超超超详细版本)

2024-06-08 1021阅读

sizeof运算符的介绍

  • 1、定义
  • 2、基本数据类型
  • 3、变量
  • 4、指针
  • 5、数组
  • 6、参数数组
  • 7、结构体

    1、定义

    ⭐⭐sizeof是一个单目运算符,不是函数,不要觉得平时使用会带()就觉得是函数了哦,它是32个关键字中的一员。

    C语言:sizeof运算符(超超超详细版本)

    sizeof返回一个对象在内存中所占的存储空间,单位是字节byte。

    2、基本数据类型

    基本数据类型包括整型short、int和long,浮点型float和double,字符型char,直接上代码:

    printf("short int=%lld\n", sizeof(short));
    printf("int=%lld\n", sizeof(int));
    printf("long int=%lld\n", sizeof(long));
    printf("long long int=%lld\n", sizeof(long long));
    printf("float=%lld\n", sizeof(float));
    printf("double=%lld\n", sizeof(double));
    printf("char=%lld", sizeof(char));
    

    C语言:sizeof运算符(超超超详细版本)

    补充:除了基本数据类型一定要用sizeof( )之外,下面的可以不用(),这也是区分sizeof不是函数的一种证明,不过我们习惯上会加上括号,看个人习惯吧。

    如果出现错误C6328可以看看我的另一篇文章:C/C++编程报错合集(2):C6328 :大小不匹配 :已将_int64作为__Param_(2)传递,但需要使用int来调用printf

    3、变量

    很简单,和上面差不多,只不过换成变量形式而已。

    short int a = 1;
    int b = 1;
    long int c = 1;
    long long d = 1;
    float e = 1;
    double f = 1;
    char g = 'a';
    printf("a=%lld\n", sizeof(a));
    printf("b=%lld\n", sizeof(b));
    printf("c=%lld\n", sizeof(c));
    printf("d=%lld\n", sizeof(d));
    printf("e=%lld\n", sizeof(e));
    printf("f=%lld\n", sizeof(f));
    printf("g=%lld", sizeof(g));
    

    C语言:sizeof运算符(超超超详细版本)

    4、指针

    如果还没有学过指针的一定要去学啊,因为指针真的很重要哦。(这里默认已经学过了哈,如果有时间再写指针的文章吧,现在没有时间呢😂)

    我们可以把指针看成一个指针变量,存储的是其指向对象的地址(一定要清楚指针存的是地址,要想访问里面的内容加一个*就可以了),通常情况下,指针在32位系统下是4字节的,64位系统下是8字节的,无论指针是整型还是其他类型,只要你的系统不变,那输出的都是一样的。

    C语言:sizeof运算符(超超超详细版本)

    上面代码我没有对指针赋值哈,是错误滴,实际使用不要像上面一样哦;

    5、数组

    (我个人认为数组是最特别的,和你们唠嗑一下,我为什么写这篇文章嘞?因为我想求数组的实际长度,而由于C语言太底层了,很多方便的操作没有弄,所以这些得自己写,顺便把sizeof写一下哈哈哈。)

    sizeof(数组名)得到的结果是整个数组所占用的内存字节数,其实我当时在想,数组名不就是指针吗?得出的结果不应该是8吗?这种想法是错误的哈❌,数组名 != 指针,不要混淆了,反正只要记住,编译器自己会识别数组和指针就可以了,其他的不用管。

    最后求一下数组的长度吧(简单举例哈):

    C语言:sizeof运算符(超超超详细版本)

    朋友们,用sizeof()一定要用%lld啊,为什么请看上面的报错链接。上面的代码是很经常求数组长度的一种哈,C语言不像Java这些有很多库函数调用,很多都要自己写,不过C语言一定要学哦,因为大家入门必学的课程就是C语言。

    对了,字符串的末尾会自动加上一个NULL,所以会多出一个字节。(C语言不支持String类型和bool类型哦)

    C语言:sizeof运算符(超超超详细版本)

    6、参数数组

    参数数组也是一个特殊的存在,当数组作为参数进行传递的时候,数组其实退化成了指针,不用问为什么?这是极少数的情况,所以我也没有深入了解嘻嘻嘻。

    C语言:sizeof运算符(超超超详细版本)

    7、结构体

    噔噔噔,有一个特殊滴出现啦,顺便给大家介绍一下字节对齐(即内存对齐)

    ⭐C语言中变量只能存储在它实际类型长度的整数倍地址上

    什么意思呢?举个例子吧,int a = 1;由于int型是战4个字节的,所以a的存储地址只会为4的整数倍,比如0,4,8,12…

    继续来介绍结构体和字节对齐:

    结构体对齐要注意两个:Ⅰ、⭐C语言中变量只能存储在它实际类型长度的整数倍地址上

    Ⅱ、最后输出的结果要是结构体中最长字段的最接近的整数倍(假设你算出的是7,而结构体中有int型,则应该输出8)

    struct abc1 {
    	char a;		//1
    	short b;	//2
    	int c;		//4
    };
    

    输出是什么呢?是不是7?❌啦,答案是8!

    C语言:sizeof运算符(超超超详细版本)

    详解:

    C语言:sizeof运算符(超超超详细版本)

    上面结果可以得出abc1结构体占用的内存空间为8,是int的最接近的整数倍。其中1位置会由编译器自己填充,我们不用管。(上面的就是字节对齐啦,可以提高CPU访问的效率)

    再来个题练练手吧!

    #include 
    struct abc1 {
    	char a;		//1
    	double b;	//8
    	char c;		//1
    };
    int main() {
    	struct abc1 temp;
    	printf("%lld", sizeof(temp));
    }
    

    C语言:sizeof运算符(超超超详细版本)

    详解:

    C语言:sizeof运算符(超超超详细版本)

    看到内存中最后一个位置是16,但是输出的时候得是double的整数倍,那么最近的整数倍是什么?24,搞定。

    吃饭啦,记得点赞啊,别白嫖啊,朋友们!!!

    有错误记得评论区见哦。

    大家一起学,一起进步!!!

    各位宝子们如果觉滴还不错的话,可以点个赞 or 收个藏 or 打个赏哦,佛系博主一个。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]