美文网首页
第二章、c语言中级阶段

第二章、c语言中级阶段

作者: 冲浪小子 | 来源:发表于2018-02-27 11:11 被阅读0次
    Day4.switch和for循环

    Switch用法

    1. 拿到条件表达式的返回值(注意返回值必须是整型)
    2. 利用条件表达式的返回值和switch后面大括号中的每一个case进行比较, 判断条件表达式的返回值和case后面的整数是否相等 条件表达式 == 整数
    3. 如果条件表达式的返回值等于某一个case后面的整数, 那么就会执行该case后面的语句
    4. 执行完语句之后如果遇到break就会结束整个switch语句, 也就是说后面的所有语句都不会被执行
    5. 如果前面的case不满足, 也就是前面的case的整数和条件表达式的返回值不相等就会继续判断后面的case
    6. 如果前面所有的case都不满足, 就会执行default后面的语句
    /*
        // Switch的条件表达式必须是返回整数的表达式, 也就是说()中只能放整数
        // 或者写能够转换为整数的类型也可以, 例如char, 因为char类型可以转换为int类型, 所以写char也可以
        switch ('A') {
            case 6:
                printf("6");
                break;
            case 8:
                printf("8");
                break;
            default:
                printf("other");
                break;
        }
         */
    case的取值不能重复
    case后面不能放变量, 因为系统在编译的时候会对Switch后面所有的case进行优化, 会根据case后面的常量值, 生成一张取值表
    Switch中的default可以随便放
    无聊default写到什么地方, 它都会最后执行(只有前面所有的case都不满足的情况才会执行)
    
      • 什么时候用switch, 什么时候用if
        在开发中一般情况下用if, if比较灵活
        如果说是对一些固定的值进行判断, 并且这些值得数量不多的情况, 可以使用switch
        从理论上来说, switch的性能效率比if高
    Day5.函数递归函数和多文件开发

    函数的声明和递归函数

    很简单可以看些代码
    1, include函数的使用
    告诉系统printf函数是存在的。

     include后面的 <> 和 "" 的区别
     >如果使用<>代表会先从开发工具的编译环境中去查找
        + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/
     
     >如果编译环境中没有找到, 那么会再去系统的编译环境中找
        + /usr/include/stdio.h
     
     >如果使用""代表会先从当前文件所在的文件夹下面查找
     >如果在当前文件所在的文件夹下面没有找到, 那么就回去开发工具的编译环境中去查找
     >如果编译环境中没有找到, 那么会再去系统的编译环境中找
     
     注意: include后面不一定要写文件名称 也可以写路径(相对路径/ 全路径)
     #include "/Users/xiaomage/Desktop/课堂共享/day05/code/day05/include基本概念/abc/lnj.txt"
    

    2, 多文件开发
    要引用lisi的文件 只需建立一个lisi.h文件,然后再zhangsan.c中导入lisi.h

    Day6.进制

    1, 进制的了解

    //     1.默认就是10进制
        int num = 12;
    //    2.在前面加上一个0就代表八进制
        int num1 = 014;
    //    %d是以十进制的方式输出一个整数
        printf("%d\n", num1);
    //    %o是以八进制的方式输出一个整数
        printf("%o\n", num);
    //    在数值前面加上0b就代表二进制
        int num2 = 0b1100;
        printf("%d\n", num2);
    //    在数值前面加上0x就代表十六进制
        int num3 = 0xc;
        printf("%d\n", num3);
    //     %x是以十六进制的方式输出一个整数
        printf("%x\n", num);
    //     口诀:不看你怎么存,只看你怎去取
    

    2, 原码反码补码

    1, 正数的特点:(三码合一) 正数的原码就是TA的反码就是TA的补码
    2, (反码, 符号位不变其它位取反)
    3, (补码 , 反码+1)
    结论:无论正数负数在内存中存储的都是补码
    

    3, 存储的细节

    // 变量为什么要有类型? 每种类型占用的内存空间不一样 int 4, char 1 double 8
        // 只要定义变量, 系统就会开辟一块存储空间给我们的变量存储数据, 内存寻址是从大到小
        // 越先定义的变量, 内存地址越大
        // 变量的地址就是所占的存储空间最小的字节地址
    int num;
        // 注意: 由于内存寻址是从大到小, 所以存储数据也是从大到小的存储(先存储二进制的高位, 再存储低位)
        //  高位   -->                    低位
        // 00000000 00000000 00000000 00001001
        num = 9; // 9 -->二进制 -->存储(补码)
        int value;
        value = 600; //00000000 00000000 00000010 01011000
        // %p是输出地址
        // &变量名称, 是取出变量的地址
        printf("num = %p\n", &num);
        printf("value = %p\n", &value);
    

    4, 进制类型说明

     类型说明符:
     1.说明长度的(它可以用于修改类型所占用的存储空间的大小)
     short; short == short int  == 2个字节 == %hi/ %hd
     long; long == long int  == 8个字节 == %li / %ld
     long long; == long long int  == 8个字节 == %lli / %lld
     
     用于说明数据类型, 一般情况下和int配合使用
     
     2.说明符号位(它可以用于修改符号位是否用于正负数)
     unsigned; 无符号 , 取值正数和零 == %u
     signed; 有符号, 默认就是有符号 , 取值 正数和零以及负数
     
     3.不同类型的说明符可以混合使用
     unsigned short
     signed long
     // 注意: 相同类型不能在一起使用
     unsigned signed
    
    Day7.数组和排序

    函数和数组

    
    // 基本数据类型作为函数的参数是值传递
    // 如果形参是基本数据类型, 在函数中修改形参的值不会影响到实参的值
    void change(int value)
    {
        value = 55;
    }
    
    // 注意: 数组名作为函数的参数传递, 是传递的数组的地址
    // 因为数组名就是数组的地址 &number = &number[0] == number
    // 注意: 如果数组作为函数的形参, 元素的个数可以省略
    // 如果形参是数组, 那么在函数中修改形参的值, 会影响到实参的值
    //void change2(int values[2])
    void change2(int values[])
    {
    //    values[0] = 88;
        values[1] = 99;
    }
    int main(int argc, const char * argv[]) {
        /*
        int num = 10;
        change(num);
        printf("num = %i\n", num);
         */
        
        int nums[2] = {1, 5};
        /*
        change2(nums); // 相当于传递了数组的地址
        printf("nums[1] = %i\n", nums[1]);
         */
        change(nums[0]);
        printf("nums[0] = %i\n", nums[0]);
        return 0;
    }
    
    Day8.二维数组、字符串和指针

    1, 二维数组

    元素类型 数组名称[行数][列数];
        int scoress[3][5] =
        {
            {1, 3, 5, 7, 9}, // 0 // 每一个一维数组都是二维数组的一个元素
            {2, 4, 6, 8, 10},// 1
            {1, 2, 3, 4 , 5} // 2
        };
    
    char names[2][3] =
        {
            {'l', 'n', 'j'}, // 0
            {'x', 'm', 'g'} // 1
        };
    //    &names == names == &names[0] , names就是数组的地址
    

    注意点:1,以后只要看到函数的参数是一个数组, 那么就是地址传递
    2, 在函数中修改形参的值会影响到参数

    2,字符串
    C语言规定, 字符串必须以\0结尾(作为字符串的结束符号), 所以字符串变量的元素个数比字符数组的元素个数多一个 \0
    3,指针

    int *p; // 指针 , 在64位编译器下占用8个字节
        // 千万注意: 指针变量只能存储地址
        p = &num; // 将num的地址存储到p这个指针中
    
    
    // 4.不要访问野指针
        /*
        // 没有赋值的指针, 我们称之为野指针
    //    int *p;
        int *p = NULL; // 0
        printf("%i\n", *p);
         */
    多级指针
        char c = 'a';
        char *cp;
        cp = &c;
        char **cpp;
        cpp = &cp;
        char ***cppp;
        cppp = &cpp;
        printf("cppp = %c\n", ***cppp);
        
        /*
         *cp == c;
         *cpp ==  cp;
         **cpp == *(*cpp) == *cp == c
         多级指针的操作, 最简单的方式, 就是通过几颗星来存储, 就通过几颗星来访问
         还有一种方式就是画图, 看图片中有几个箭头, 有几个简单就用几颗星来访问
         */
    

    相关文章

      网友评论

          本文标题:第二章、c语言中级阶段

          本文链接:https://www.haomeiwen.com/subject/tkfqtftx.html