C语言(十二)

作业分析讲解:
=====================
1.  经验:  
            第一种:   寻找段错误的原因
                           思路:通过打印语句定位段错误的大致位置,然后用特殊的例子带入到你的代码中一步步计算打印关键变量的值
           第二种:   写代码思路
‘                            特殊---》一般
2. 大端序和小端序
        大端序: 数据的高字节存放在低地址,低字节存放在高地址
        小端序:   数据的高字节存放在高地址,低字节存放在低地址

宏定义
================
1.  宏定义:  理解为字符的替换
     语法:  #define   PI   3.14   //定义了一个宏,名字叫做PI,代表3.14这个小数
                 注意:宏定义的名字一般都写成大写
      优点: 宏定义的执行效率很高(宏定义在预处理的时候就已经被替换了,而变量等到程序运行的时候才会加载到内存种参与运算),宏定义不是变量
     宏定义总共两种表现形式:
                形式1:  普通的宏定义      #define   PI   3.14      不要理解为变量了
                形式2:  宏函数                #define   ADD(a,b)    (a)+(b)  
                               注意:  宏函数不是真正意义上的函数
                                         宏函数一定加上圆括号(为了防止出现优先级的问题)     
                                         宏定义如果有多行(一行写不下),必须加上续行符
练习:
         1.   #define   MUL(a,b)   a*b
               #define   MUL(a,b)   (a)*(b)   //最安全正确的写法
               MUL(1+2,3+4);   //结果是多少
               宏替换成1+2*3+4=11
               宏替换成(1+2)*(3+4)=21
         2.  面试题种所有宏定义相关的题目
C语言中printf和scanf的工作原理
==================
1.  scanf工作原理
           返回值:表示输入的符合要求的数据个数
            scanf和printf在系统中有个IO缓冲区,键盘输入的内容先进入到缓冲区,然后scanf从缓冲区里面读取符合要求的数据
           int getchar(void)      一次从缓冲区中读取一个字符(并把字符从缓冲区里面剔除)

2. printf工作原理
           先将输出的内容存放到IO缓冲区里面,遇到\n或者return  0 主函数退出会自动刷新缓冲区(把缓冲区里面的内容显示在液晶屏上面)

C语言中的结构体,共用体,枚举
==================
  1.  结构体:
             定义:   struct   结构体的名字
                        {
                               结构体成员;
                       };
                       比如:  struct  student   //把不同类型的数据打包成一个整体,程序员自定义了一种新的数据类型
                                    {
                                char name[10];
                                        int age;  
                                   };
                       简化书写   typedef  struct  student 
                                         {
                                    char name[10];
                                                    int age;  
                                        }stu,*pstu;    //stu就是 struct  student 类型名      stu  stu1; //stu1是个普通结构体变量  
                                                                    pstu就是struct  student  *类型名  pstu  stu4;  //stu4是个结构体指针变量
                                                                              
             结构体的初始化和使用:
                      struct  student  stu1={“张三”,18};
                      struct  student  stu1;
                      stu1.name="张三";
                      stu1.age=18;
                      struct  student  stu1={
                             .name="张三";
                             .age=18;
                      }
                       struct  student  *stu1;
                       stu1->name="张三";
                       stu1->age=18;
                       struct  student  *stu1;
                      (*stu1).name="张三";
                       (*stu1).age=18; 
              普通结构体变量使用小数点引用成员:struct  student stu1      stu1.age;
              结构体指针使用->引用成员:    struct  student  *p;     p->age;
2. 结构体大小规则
         32位系统
              第一步:找到结构体成员中数据类型最大的成员
              第二步:如果数据类型最大成员>=4字节,那么整个结构体按照4字节对齐
                            如果数据类型最大成员<4字节,那么整个结构体按照最大数据成员的大小对齐
              第三步:如果char和short连续挨在一起,需要合并
         64位系统
              第一步:找到结构体成员中数据类型最大的成员
              第二步:如果数据类型最大成员>=8字节,那么整个结构体按照8字节对齐
                            如果数据类型最大成员<8字节,那么整个结构体按照最大数据成员的大小对齐
              第三步:如果char和short连续挨在一起,需要合并(小心这一步跟32位系统的区别)

    3. 联合体(共用体)
            定义:  union  联合体的名字   //跟结构体写法类似
                      {

                      };
                        union  sex
                       {
                              char  a;
                              char  b;
                       };
                      普通联合体变量:  union  sex   sex1;    sex1.a='M';
                      联合体指针:         union  sex   *p=&sex1;      p->b='W';
                      联合体数组:         union  sex   array[10];
              跟结构体的区别,特点:
                      联合体中所有的成员变量占用同一块内存区域(成员变量是互斥)
                      联合体大小由最大成员的大小决定,也要满足字节对齐
             实际用途:
                      用来表示互斥的概念--》用联合体
                            union  sex                            union  手机型号
                            {
                                          char  man;   //   'M'  --》男     'W' --》女
                                          char  woman;
                            }

     4. 枚举:
               定义:  enum   枚举的名字  {枚举数据}
                            enum  day {mon,tues,wen};
                            enum  color  {red, green  blue};
练习:
         1.  截图中的提示,求a是多少

C语言中的头文件
===================
     作用: 包含其它头文件
                 结构体,联合体,枚举的定义
                 全局变量,函数的声明
                 内联函数定义
                 宏定义
     头文件的标准写法:
                参考系统中标准头文件:   #ifndef   _XXXX_H     目的为了防止重复包含同一个头文件
                                                          #define   _XXXX_H

                                                          #endif
     头文件<>和“”区别:
                <>  --》多用于系统自带的头文件,编译器会自动去系统的环境变量中寻找这个头文件
                环境变量:系统的一个默认路径/usr/include
                “”   --》多用于自定义的头文件,编译器会自动从当前路径下寻找这个头文件,如果当前路径下面没有,就去环境变量中找
               告诉编译器自定义的头文件在哪里
                      gcc   hello.c   -o  hello   -I头文件的路径

C语言程序编译的四个过程
============
       hello.c源文件  --->hello 可执行程序  经历四个过程: 预处理--》编译--》汇编--》链接生成可执行程序
       以前编译代码一步到位:   gcc  hello.c  -o   hello
       现在分成四步:
              第一步:  预处理 --》把C语言代码中所有#开头的语句展开
                                                C语言#开头的语句只有三种:
                                                  第一种: #include <>     把头文件的源码搬过来
                                                  第二种:#define    宏替换,宏定义都替换成对应的字符
                                                  第三种:条件编译     
                                  gcc  hello.c   -o   hello.i   -E    //    -E编译选项表示我要对hello.c进行预处理    
             第二步:编译 --》把.i文件编译生成.s汇编文件
                                 gcc  hello.i  -o   hello.s   -S    //     -S编译选项表示我要对hello.i编译成汇编代码
             第三步:汇编 --》把.s文件编译生成.o文件
                                 gcc  hello.s  -o   hello.o  -c  //      
             第四步:链接生成可执行程序
                                gcc  hello.o  -o   hello                                                                                                           
C语言的条件编译(跟宏定义配合使用)
==============
   1. 作用: 满足条件就会帮你编译代码,不满足,就不编译(代码写了跟没写一样,被注释掉了)
   2. 写法一:
          #if  宏定义  //判断宏定义的值是真还是假
               代码;
         #else
               代码;
         #endif
          变形形式:  #if    #elif    #else   #endif
       写法二:
           #ifdef  宏定义    //宏定义定义了就执行,不是判断真假
                 代码;
           #else     //没有定义
                 代码;
           #endif
        写法三:
           #ifndef  宏定义   //  宏定义没有定义就执行
                  代码;
           #else   //定义了就执行
                  代码;
           #endif 
  注意:以上都是完整的标准写法,  #else可以写也可以不写的  

作业:
      1.   scanf("%d",&n);   //   34hhh   不正确的整数
      2.  面试题中结构体有关的题目全部做完

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值