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 位编译器)
    

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

  • 相关阅读:
    后缀数组-另辟蹊径
    Project Euler 不定期更新
    Educational Codeforces Round 93 (Rated for Div. 2)
    Codeforces Round #664 (Div. 2)
    lower_bound和upper_bound的用法
    Codeforces Round #663 (Div. 2)
    Codeforces Round #661 (Div. 3)
    质数笔记
    C++运算符的优先级
    图的构建
  • 原文地址:https://www.cnblogs.com/dongfengweixiao/p/6052578.html
Copyright © 2011-2022 走看看