嵌入式学习第十天

1.宏:
    1.宏是代码的替换,中间不进行任何数据计算的操作
    2.能加括号就加括号,不好吝啬小括号

    不带参宏
    带参宏(宏函数)

嵌入式学习第十天_第1张图片嵌入式学习第十天_第2张图片

    带参宏与函数的区别:
        1.函数有参数类型、返回值、调用的概念
        2.带参宏只是代码的替换
        3.带参宏会让程序代码体积增大
        4.函数不会让程序代码体积增大
        5.函数传参会占用资源开销,增大程序运行时间
        6.带参宏没有传参调用的过程,程序运行速度更快

    带参宏:
        用于封装比较简单的模块代码

=========================================================================
1.指针:
    1.代码更加简洁高效
    2.指针可以直接访问内存
    3.指针可以操作硬件

2.概念:
    1.地址:用来区分内存中不同字节的编号
    2.指针:指针就是地址,地址就是指针,指针多了指向的概念
    3.指针变量:是一个变量, 变量里面存放了一个指针(地址), 称为指针变量,
              使用指针变量等价于使用其内部存放的指针,所以我们有时也把指针变量简称为指针

3.运算符:
    &:只能操作左值(变量)
    *:只能操作指针类型

    int Num;

    &Num:
        值:获得Num变量在内存空间中的首地址
        类型:int *          (&有类型升级效果) 

    *&Num:
        值:获得&Num指针对应空间中的值
        类型:int            (*有类型降级效果)

        注意:
            作为左值,将右值放入左边指针指向的空间
            作为右值,直接取指针指向空间中的值

    *&Num = 100;
    *&Num;

嵌入式学习第十天_第3张图片嵌入式学习第十天_第4张图片

4.指针变量的定义:
    int *p;
    int *q;

    int *p, *q;

    野指针:未经初始化的指针,指向已经被释放过空间的指针称为野指针
           指针一定记得初始化
    空指针:NULL 0x0, 指向内存地址为0x0的指针

    int *p = NULL;

    所有的指针变量占8个字节


    直接访问:通过变量的变量名访问内存空间
    间接访问:通过变量在内存中的地址访问变量空间

5.指针常见操作:
    int *p = NULL;
    int *q = NULL;
    int a = 100;
    int b = 200;

    p = &a;
    q = &b;

    1.p = &b
    2.*p = b
    3.p = q
    4.*p = *q

嵌入式学习第十天_第5张图片嵌入式学习第十天_第6张图片

    练习:从终端接收两个数,利用指针对这两个数完成四则运算打印结果

嵌入式学习第十天_第7张图片嵌入式学习第十天_第8张图片

6.指针的算数运算:


    int *p = NULL;
    int *q = NULL;
    
    +
    -
    ++
    --

    p++:向内存高地址偏移指向数据类型大小个字节空间
    p--:向内存低地址偏移指向数据类型大小个字节空间

    p - q:

    int *p = NULL;
    int a = 100;
    p = &a;

    *p++;       等价于: *p; 
                        p++;
    (*p)++;     等价于: *p
                        (*p)  ++

嵌入式学习第十天_第9张图片嵌入式学习第十天_第10张图片

7.指针作为函数参数:
    1.复制传递(赋值传递)
        实参将值传递给形参,形参是实参的副本,形参改变不会影响实参

        函数体内想使用函数体外部变量值的时候使用复制传递

    2.地址传递
        实参地址传递给形参,形参就是实参的指针,可以通过对形参取*改变实参的值

        函数体内想修改函数体外部变量值的时候使用地址传递

嵌入式学习第十天_第11张图片嵌入式学习第十天_第12张图片


 

  练习:封装一个函数获得数组中的最大值和最小值
        int GetMinMaxNum(int array[], int len);

嵌入式学习第十天_第13张图片嵌入式学习第十天_第14张图片


练习:
    1.封装一个函数,完成传入两个数值,获得这两个数值的最大公约数和最小公倍数
        6  9 

        最大公约数:3
        最小公倍数:18 

    2.求出数组a[N][N]中主对角线最大值和辅对角线最小值

        #define N   5

        int a[N][N];

  1 #include                                                                                                                                                                                                                                                                                             
  2 
  3 int MaxDivMul(int a ,int b ,int *p,int *q)
  4 {
  5     int i = 0;
  6     int j = 0;
  7     int max = 0;
  8     int min = 0;
  9 
 10     min = (a < b ? a : b);
 11     max = (a > b ? a : b);
 12 
 13     for (i = min ;i >= 1;i--)
 14     {
 15         if ( 0 == a % i && 0 == b % i)
 16         {
 17             break;
 18         }
 19     }
 20     *p = i;
 21 
 22     for (j = max ;j <= a * b;j++ )
 23     {
 24         if (0 == j % a && 0 == j % b)
 25         {
 26             break;
 27         }
 28     }
 29     *q = j;
 30 
 31 
 32     return 0;
 33 }
 34 
 35 int main(void)
 36 {
 37     int num1 = 0;
 38     int num2 = 0;
 39     int Maxyushu = 0;
 40     int Maxbeishu = 0;
 41 
 42     scanf("%d",&num1);
 43     scanf("%d",&num2);
 44 
 45     MaxDivMul(num1,num2,&Maxyushu,&Maxbeishu);
 46 
 47     printf("Maxyushu = %d\n",Maxyushu);
 48     printf("Maxbeishu = %d\n",Maxbeishu);
 49 
 50     return 0;
 51 }

嵌入式学习第十天_第15张图片嵌入式学习第十天_第16张图片

  1 #include 
  2 #define N 5                                    
  3 
  4 int main(void)
  5 {
  6     int a[N][N] = {0};
  7     int i = 0;
  8     int j = 0;
  9     int max = 0;
 10     int min = 0;
 11 
 12     for (j = 0; j < N;j++)
 13     {
 14         for (i = 0; i < N;i++)
 15         {
 16             scanf("%d",&a[j][i]);
 17         }
 18     }
 19 
 20     max = a[0][0];
 21 
 22     for (i = 0;i < N;i++)
 23     {
 24         if (max < a[i][i])
 25         {
 26             max = a[i][i];
 27         }
 28     }
 29 
 30     printf("max = %d\n",max);
 31 
 32     min =a [0][N-1];
 33 
 34     for (i = 0;i < N;i++)
 35     {                                                                                                                                                                                                                                                                                                         
 36         if (min > a[i][N - 1 - i])
 37         {
 38             min = a[i][N - 1 - i];
 39         }
 40     }
 41 
 42     printf("min = %d\n",min);
 43 
 44     return 0;
 45 }

嵌入式学习第十天_第17张图片嵌入式学习第十天_第18张图片

你可能感兴趣的:(学习,嵌入式硬件,c语言)