• C语言深入学习


    • 计算机存储篇

       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。



          

      

        

  • 相关阅读:
    js中location.href的用法
    entityframework单例模式泛型用法
    [C#]从URL中获取路径的最简单方法-new Uri(url).AbsolutePath
    等到花儿也谢了的await
    ASP.NET MVC下的异步Action的定义和执行原理
    实际案例:在现有代码中通过async/await实现并行
    ASP.NET MVC Controllers and Actions
    扩展HtmlHelper
    iOS开发网络篇—XML数据的解析
    IOS学习:常用第三方库(GDataXMLNode:xml解析库)
  • 原文地址:https://www.cnblogs.com/kensporger/p/11234875.html
Copyright © 2020-2023  润新知