zoukankan      html  css  js  c++  java
  • 聊聊 C 语言中的 sizeof 运算

    聊聊 sizeof 运算

    在这两次的课上,同学们已经学到了数组了。下面几节课,应该就会学习到指针。这个速度的确是很快的。
    对于同学们来说,暂时应该也有些概念理解起来可能会比较的吃力。

    先说一个概念叫内存的错误访问。对应的运行错误可能是段错误等。同学们暂时脑海中有这个概念而不用深究。
    内存的访问错误,多数情况下都是数组和指针导致的。这里简单的说下如何使用sizeof运算符避免数组中的错误访问。

    假设有这样的一个数组,char a[11],之前,如果想要将这个数组填充满,大家可能使用这样的做法:

    for(int i = 0;i < 11;i++)
    {
      a[i] = i;
    }
    

    但是,要是哪天小手一抖,或者是一些其他的情况,比如忽然发现,哎a本来是想要存储helloworld的,
    可以存下,但是我现在要存储hello,要不我将a设置的小一点,比如char a[6]。这时候,如果不更改这个for循环,就会出现尴尬的问题,for循环会继续去尝试访问a[6...10],而实际上,并不存在。

    假如使用sizeof运算符,就可以很好的避免这一尴尬的事情发生。以上的for循环代码就变成了:

    for(int i = 0;i < sizeof(a)/sizeof(a[0]);i++)
    {
      a[i] = i;
    }
    

    (其实以上的代码稍微有点多此一举。)

    这里, 简单的说下sizeof运算符的用法:

    • sizeof(字面量):它将会尽量的匹配这个尝试,比如如果字面量是1,它试图理解为int,如果字面量是3.14,它试图理解为一个float,如果是"helloworld",则试图理解为一个字符串。
    #include<stdio.h>
    
    int main(){
        printf("%d %d %d
    ",sizeof(1),sizeof(3.14),sizeof("helloworld"));
        return 0;
    }
    // 结果分别为 4 8 11(64 位系统,64 位编译器)
    
    • sizeof(类型):如果传递进去的是数据的类型,则返回这个类型的字节宽度。
    #include<stdio.h>
    
    int main(){
        printf("%d %d %d
    ",sizeof(char),sizeof(int),sizeof(float));
        return 0;
    }
    // 结果分别为 1 4 4(64 位系统,64 位编译器)  
    
    • sizeof(指针):返回系统指针的空间大小。比如在 32 位系统中,指针的宽度是 4 字节,在 64 位系统中,是 8 字节。这里需要扩展一个东西,就是当函数的参数是数组的情况。实际上,当一个函数的参数中存在数组,实际上将会退化为一个指针,那么在这个函数中进行 sizeof 运算时,实际上和求指针的长度别无二致。
    #include<stdio.h>
    
    int getsize(char a[]){
      return sizeof(a);
    }
    
    int main(){
      char a[10] = "hello";
      char *ap = a;
      int *b;
      *b = 10;
      printf("%d %d %d %d
    ",sizeof(a),sizeof(ap),sizeof(b),getsize(a));
      return 0;
    }
    // 10 8 8 8(64 位系统,64 位编译器)
    

    最后一段代码,对于当前的同学们来说是没有办法理解的,同学们仅需要有一个印象,等学习到后面的课程再行理解。

  • 相关阅读:
    leetcode 190 Reverse Bits
    vs2010 单文档MFC 通过加载位图文件作为客户区背景
    leetcode 198 House Robber
    记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
    逆序数2 HDOJ 1394 Minimum Inversion Number
    矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
    递推DP URAL 1586 Threeprime Numbers
    递推DP URAL 1167 Bicolored Horses
    递推DP URAL 1017 Staircases
    01背包 URAL 1073 Square Country
  • 原文地址:https://www.cnblogs.com/dongfengweixiao/p/6052578.html
Copyright © 2011-2022 走看看