• 计算机存储篇

   1.计算机对数据类型的辨别:

      编译器在编译C程序时将其转变为汇编指令,其中指明了数据类型。此外,每种数据类型都有固定的存储长度,计算机运行程序时,会根据具体类型

    读出相应长度的数据进行计算。

   2.程序的存储:

      指令空间+静态数据空间+动态数据空间。

   3.字长:

      计算机进行一次运算所能处理的二进制最大位数,常用的有32位、16位、8位等。

   

  • 数据类型与运算篇

   1.C语言数据长度(机器字长32位):

      int :   4字节(=字长)      long :  4字节(=字长)

      float :   4字节            double :    8字节

      short :     2字节

   2.赋值运算中的类型自动转换:

      将数据长度短的转换为数据长度长的;

      数据类型不同,则转换为相同类型;

      浮点运算总是转换为double类型;

      char类型在运算中转换为整形;

      有符号与无符号混合运算时,总是转化为无符号;

      当赋值号右边式子计算完后,其结果类型自动转化为左边的数据类型;

  3.负数右移,在补码的右边补1,因此,多次右移后,补码每一位都变为1,即负数值为-1。

  4.自增自减运算的代码执行速度比赋值快。

  5.复合赋值语句的代码执行速度比先运算再赋值快。

  • 控制语句篇

  

    1.goto语句只能跳出到外层,而不能进入内层,也不能从一个函数内部跳到另一个函数内部。

  • 数组篇

    1.除了二维数组,还可以定义更高维的数组,如a[2][2][2],意义上表示空间,比如可以用三维数组存储全校各班各学生的各科成绩。但是,使用高维的数组,会

     使得计算机计算下标的工作量变大,影响效率。

    2.数组初始化特殊的赋值方法:

      int a[40]={2,[10]=3,[30]=9};      //其他元素值都为0
      int b[10][10]={[5][6]=2}; //其他元素值都为0

    3.动态分配数组:

      int *a;
      a=(int*)malloc(10,sizeof(int));    //分配大小为10个int元素的数组,将数组首地址赋值给a
      a[0]=1;a[1]=2;              //赋值
      a=(int*)realloc(15,sizeof(int));   //数组扩展(原数据保留),可能会扩展失败,那么数组首地址为NULL
      free(a);                 //释放空间   
  • 函数篇

    1.可变参函数创建:

      void func(int length,...)
      {
        int i;
        va_list vp;
        va_start(vp,length);
        for (i=0;i<length;i++)
          printf("%d ",va_arg(vp,int));
        va_end(vp);
      }
  • 特殊数据类型篇

    

    1.联合:类似于结构体,但成员共用一段内存,该内存大小为成员最大长度。当为一个成员赋值时,其他成员的值就会被覆盖,定义方法如下:

      union myunion
      {
        char a;
        int b;
      };
      union myunion c;

      该联合体的大小为int类型的大小。

    2.位域:将一个字的每一位看做成员来操作,位域不能跨越两个字节,因此其长度不能超过8位,定义方法如下:

      struct font
      {
        unsigned char italic:1;
        unsigned char bold:1;
        unsigned char :4;
        unsigned char underline:2;
      };
      struct font font1;
      font1.italic=0;
      font1.bold=1;
      font1.underline=3;

      该位域成员包括:占用字节bit0位的italic、占用bit1位的bold、占用bit2-bit5四位的保留位、占用bit6和bit7的underline。

    

    3.位域与联合的组合运用:

      union Byte
      {
        unsigned char byte;
        struct
        {
          bit0:1;
          bit1:1;
          bit2:1;
          bit3:1;
          bit4:1;
          bit5:1;
          bit6:1;
          bit7:1;
        }bit;
      };

      通过上面组合,既可以整体操作字节,也可以方便地实现位操作。

    
    
  • 内存管理篇

    

    1.内存组织形式:

      静态存储分配:编译时确定的变量空间,像全局变量与静态变量采用这种方式分配。

      栈:在编译时不分配空间,但需要知道程序所需的空间大小,然后在程序运行时进行分配,像函数内部的局部变量就采用这种方式分配。栈的分配方向是高地址向

        低地址,并且分配时连续的,是先入后出的队列结构。栈由编译器分配与释放,它的空间小于堆,当申请的空间超过最大栈空间时,会提示"堆栈溢出"。

      堆:堆得分配是以不连续块为形式的,系统通过链表将这些块连接起来,例如malloc等函数就是在堆中进行分配。堆的空间一般比较大。

      

      案例分析:

      int i=0;
      char *p;
      int main()
      {
        static int s=1;
        char s2[]="hello";
        char *s3="world";
        p=(char *)malloc(sizeof(s2));
        return 0; 
      }

      上述代码中,i为全局变量,在静态存储区域分配;s由于有static修饰,也在静态存储区域分配;s2属于局部变量,在栈中分配,字符"hello"也存在该数组区域中;

      s3分配在栈中,保存的是字符串的首地址,而字符串常量"world"则保存在栈中的另外区域;p属于全局变量,故在静态存储区域分配,保存的是分配空间的首地址,

      而malloc分配的空间则在堆中。

    2.malloc(size)分配连续的大小为size的连续空间,并返回void型指针,指向起始地址,如果分配失败则返回NULL,因此,对malloc的结果应该进行检查。

    3.calloc(size)同malloc,只是calloc能够在分配时将区域清0。

    4.realloc(newsize)扩大缩小原分配空间,若newsize<size,则截去尾部多余的部分;若newsize>size,则在空间尾部后连续分配。如果后面空间不足,则重新开辟一个

     大小为newsize的连续空间并拷贝原先数据,原有空间被系统自动释放;若果分配成功,返回首地址,否则返回NULL。

    5.free(p),该函数释放指针p所指向的内存空间,释放后p仍指向该内存地址,增加p=NULL语句清空p。


      

  

    

C语言深入学习的更多相关文章

  1. C语言课程学习的总结

    C语言课程学习的总结 学习C程序这门课一年了,这是我们学的第一门专业课.在大学里,C语言不但是计算机专业的必修课程而且也是非计算机专业学习计算机基础的一门必修课程.所以作为我这个计算机专业的学生来说当 ...

  2. [转]C语言指针学习经验总结浅谈

    指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...

  3. C语言(函数)学习之strstr strcasestr

    C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...

  4. 【Go语言】学习资料

    这段时间一直在看Go语言,6月3日Apple发布了swift发现里面竟然也有许多Go语言的影子,截至现在每天都在感觉到Go语言的强大.确实值得一学 今天在这里给园友们推荐一些Go语言的学习资料 网站 ...

  5. 远离go path,弃用go get,使用go mod 进行go语言的学习

    标题说的是go语言的学习,因为我也没做过开发 文章要解决的仅仅是一个问题 当你使用go get 无论如何get不到所需的包的问题 第一步就是下载goland 新手极其推荐goland,因为直接使用gl ...

  6. Dart语言快速学习上手(新手上路)

    Dart语言快速学习上手(新手上路) // 声明返回值 int add(int a, int b) { return a + b; } // 不声明返回值 add2(int a, int b) { r ...

  7. D02-R语言基础学习

    R语言基础学习——D02 20190423内容纲要: 1.前言 2.向量操作 (1)常规操作 (2)不定长向量计算 (3)序列 (4)向量的删除与保留 3.列表详解 (1)列表的索引 (2)列表得元素 ...

  8. D01-R语言基础学习

    R语言基础学习——D01 20190410内容纲要: 1.R的下载与安装 2.R包的安装与使用方法 (1)查看已安装的包 (2)查看是否安装过包 (3)安装包 (4)更新包 3.结果的重用 4.R处理 ...

  9. C++语言的学习环境

    一.Mac C++语言的学习环境 1. 1.1.C语言 :终端->bash-vi/vim文本编辑器->GNU->GCC文件编译器->a.out可执行文件 1.2.C++语言:终 ...

  10. 获奖感言和C语言的学习心得

    获奖感言和C语言的学习心得 自我介绍: 大家好,我的名字叫袁忠,我来自湖南,今年快19岁了,现在是大学一年级,我平时喜欢跑步.打羽毛球,我也喜欢学算法与数学,以及喜欢看一些与计算机有关的书籍,每次我学 ...

随机推荐

  1. java 构造方法+this+super

     构造方法的格式: 修饰符 构造方法名(参数列表) { }  构造方法的体现: 构造方法没有返回值类型.也不需要写返回值.因为它是为构建对象的,对象创建完,方法就执行结束. 构造方法名称必须和类名保持 ...

  2. ESA2GJK1DH1K升级篇: IAP详解

    前言: 源码下载链接: https://gitee.com/yang456/STM32_IAP_Learn.git 后期所有出售的升级程序皆在此代码之上进行优化和开发 请必须把此文章各个的地方的说明看 ...

  3. [RN] React Native 中使用 stickyHeaderIndices 实现 ScrollView 的吸顶效果

    React Native中,ScrollView组件可以使用 stickyHeaderIndices 轻松实现 sticky 效果. 例如下面代码中: <ScrollView showsVert ...

  4. django命名url与url反向解析

    1.在urls.py路由中指定别名 2.在views.py视图文件中导入from django.shortcuts import render, redirect, reverse 3.也可从这里导入 ...

  5. 洛谷 P1965 转圈游戏

    洛谷 P1965 转圈游戏 传送门 思路 每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,--,依此类推,第n − m号位置上的小伙伴走到第 0 号 ...

  6. 神经机器翻译(seq2seq RNN)实现详解

    http://c.biancheng.net/view/1947.html seq2seq 是一类特殊的 RNN,在机器翻译.文本自动摘要和语音识别中有着成功的应用.本节中,我们将讨论如何实现神经机器 ...

  7. HTML基础知识---文本编辑练习

    飘柔兰花去油洗发水液露去屑止痒控油                                         阿道夫净屑舒爽清洁头皮去屑洗发水520ml                      ...

  8. IOCP另一种实现

    参考 https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-bindiocompletioncallback ht ...

  9. 2019 C/C++《阿里》面试题总结

    一.C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛. C中函数不能进行重载,C++函数可以重载 C++在C的基础上增添类,C是一个结构化语言 ...

  10. js 数组sort, 多条件排序。

    Array.sort(); sort()方法可以传入一个函数作为参数,然后依据该函数的逻辑,进行数组的排序. 一般用法:(数组元素从小大进行排序) var a = [9, 6, 5, 7, 11, 5 ...