您的位置:首页 > 运维架构 > Linux

苏嵌嵌入式Linux实训 第5天

2020-07-14 06:34 141 查看

嵌入式学习第五次课程,主讲C语言的复习,以及一些相关代码的演示,只有自己动手操作,才能发现其中的妙处。

一、课程内容

位运算、基本控制语句、华为编码规范和范例、指针、数组。

位运算

&|^>><<~

基本控制语句

预处理(宏、条件编译)

时间:编译时间、运行时间
空间:内存空间

时间换空间
空间换时间

华为编码规范和范例

指针、数组(内存管理)

  • 指针

1、指针是什么?
指针是一个变量(指针变量),保存的是地址,作用:能够直接操作地址
2、指针类型是根据储存的地址的类型(类型+步长)
3、*&运算符:*取值运算符 &取地址
4、多为指针的作用“保存前一维指针变量的地址
5、指针赋予<一定是相同指针类型赋值>及运算
6、万能指针:void*:可以接收任何类型指针的值!(不能做取值和运算)
7、野指针

  • 数组

1、数组的定义及初始化
2、数组名的作用
3、数组指针

*(&a)=a;
对一维数组的地址取值等于一维数组首元素的地址

数组指针pa:
int (*pa)[MAX_SIZE]=&a;

一维数组的单位是元素,二维数组的单位是一维数组,三维数组的单位是二维数组
二维数组名:指针常量,保存首个一维数组地址
三维数组名:指针常量,保存首个二维数组地址

*aaa = 首个二位数组的首个一维数组的地址
**aaa = 首个二位数组的首个一维数组的首元素的地址

4、指针数组
5、main参数:命令行参数

二、问题解答

  • 掩码

掩码是一串二进制代码对目标字段进行位与运算,屏蔽当前的输入位。

用途:将源码与掩码经过按位运算或逻辑运算得出新的操作数。其中要用到按位运算如OR运算和AND运算。用于如将ASCII码中大写字母改作小写字母。
如A的ASCII码值为65= (01000001)2,a的ASCII码值为97=(01100001)2,要想把大写字母A转化为小写字母只需要将A的ASCII码与(00100000)2进行或运算就可以得到小写字母a。

  • &、|、^

按位与运算符“&”是双目运算符。其功能是参与运算的两个数字对应的二进制位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。

按位或运算符“|”是双目运算符。其功能是参与运算的两个数字对应的二进制位相或。只要对应的两个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。

按位异或运算符“^”是双目运算符,其功能是参与运算的两个数字对应的二进制位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现。

  • //代码的可读性

 自注释性

  • //函数调用过程

    通过函数名找到函数的人口位置
    给形参分配空间
    传参
    执行函数体的语句
    返回
    释放空间

  • //预处理

傻瓜式替换   特点:省去函数调用的时间,省去给形参分配的空间和释放

  • //什么样的函数要写成宏函数?

频繁调用且功能短小简单的函数

  • 常用宏函数

https://blog.csdn.net/Apollon_krj/article/details/82911180?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-3.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-3.nonecase

  • 其他预处理指令

#error指令将使编译器显示一条错误信息,然后停止编译。
#line指令改变_LINE_与_FILE_的内容,它们是在编译程序中预先定义的标识符。
#pragma指令没有正式的定义。编译器可以自定义其用途。典型的用法是禁止或允许某些烦人的警告信息。
复制代码
//例10,#line举例
#line   100          //初始化行计数器 
#include<stdio.h>    //行号100
int main()
{
    printf("Hello World!\n");
    printf("%d",__LINE__);
    return 0;
}

三、作业解答

#include <stdio.h>
#include "stdio.h"
void print1(char *ptr)
{
    printf("%s\n", ptr);
}
void print2(char (*ktr)[100])
{
    for(int i = 0; i < 2; i++)
    {
        printf("%s\n", *(ktr + i));
    }
}
void print3(char (*str)[2][100])
{
    for(int i = 0; i < 2; i++)
        for(int j = 0; j < 2; j++)
        {
            printf("%s\n", str[i][j]);
        }
}
void print4(char **ytr)
{
    for(int i = 0; i < 3; i++)
    {
        printf("%s\n", *(ytr + i));
    }
}
int main()
{
    char ptr[100] = "hello";
    char ktr[2][100] = {"hello1", "hello2"};
    char str[2][2][100] = {{"hello3", "hello4"}, {"hello5", "hello6"}};
    char *ytr[3] = {"hello7", "hello8", "hello9"};
    print1(ptr);
    print2(ktr);
    print3(str);
    print4(ytr);
}
 

 

 

 

 

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: