华清远见嵌入式c语言学习笔记

C补习阶段总结

毕业已经快有两年了,C语言还是刚上大学那会学习的了,该还的和不该还都都一并还给了当初的老师了。

还记得那会C语言是我们班挂科率最高的一门课程,我侥幸得以飘过,但是也给自己留下了C语言比较难的观念。计划来学习嵌入式开发之前,我都还一直比较担心会不会学不懂,跟不上老师的节奏什么的,这也是我比较担心的。最后的最后还是在朋友的推荐下来华清进行学习。

来到华清进行学习后,我对本次的补习有了一个大致的了解,其主要分为:

C语言补习              15  √

Linux 以及c高级 6

数据结构 6

IO、进程线程 6

网络编程 7

C++ 9

QT 8

ARM接口技术 7

系统移植 5

驱动编程 8

Python人工智能       9

项目实战 20

目前以及完成了C语言补习、linux及C高级以及数据结构的学习。

以下是我关于C语言补习过程中知识点的总结

  1. .c文件编译过程

预处理-->编译-->汇编-->链接

预处理:gcc -E file   展开头文件,进行宏替换     生成.i文件

编  译:gcc -S file   查找语法错误    生成.s文件  

汇  编:gcc -c file   把汇编代码解释成二进制文件 生成.o文件

链  接:gcc file.o  链接程序运行时一些必要的库 生成.o文件

助记方式

键盘上的esc按键对应预处理编译和汇编的命令;其对应生成的文件后缀为iso(镜像文件后缀)。

  1. static

将变量存入静态缓存区;

修饰局部变量时:生命周期延长,作用域不变;

修饰全局变量时:生命周期不变,作用域被限制;

修饰函    数时:生命周期不变,作用域被限制;

  1. 控制语句

break:跳出当前所在的控制;

continue:跳出本次控制(循环);

return:结束函数模块,并且可以返回一个值;

  1. 指针

内存是由多个内存单元组成,每个单元都由一个或多个字节组成,每个字节都有唯一编号,我们叫这个编号为地址;

地址就是指针;

指针变量的数据类型是由指向空间的类型决定的。

const 修饰指针:

const int *p :指针指向空间的内容无法修改,只读;

int *const p :指针的指向无法修改;

  1. 数组

数组是一些相同类型的集合;存储上是一片连续的存储空间。

使用时需要注意不能越界,

二维数组:

多个相同类型的一维数组的集合,储存上也时一片连续的空间。

注意:二位数组的行和列是为了方便理解而抽象出来的,实际上其在内存空间中的存储是线性的。

  1. 指针与一维数组的关系

一维数组的数组名就是数组的指针,指向数组的首元素的地址,但是数组名是常量,不能更改,也不能进行自加和自减。

  1. 指针与二位数组的关系

数组指针:也称行指针;本质是指针,指向二维数组的每一行的首元素的指针;

int (*p)[n]  :p :变量名称  n :与二位数组的行数相等;

int a[3][n];

p = a ;

以上代码片段中:p[0] 表示指向a数组的第一行第一个元素

p[i]+j 表示指向a数组第i行第j列的元素;

p[i][j] == *(p[i]+j) == *(*(p+i)+j)

函数{
    特定功能的代码模块
    声明:<存储类型><数据类型> 函数名(参数列表);
    定义:<存储类型><数据类型> 函数名(参数列表)
        {
            函数体;
            return 返回值;
        }
        数据类型:不由函数本身决定,而是由函数的返回值类型来决定
                    void 表示没有返回值
                    void *表示返回一个任意类型的指针
        返回值:只能返回一个结果(数值、地址)
        参数列表:形参,在意类型
        
    使用:函数名(参数列表);
        参数列表:实参,在意具体的数据(一定要对应形参的类型)
        
    
    虽然形参只在意类型,但是函数在调用的时候形参也会开辟空间    
    
    
    参数传递方式:{        //函数调用都会涉及到拷贝过程
        按值传递:拷贝内容,有点在于很安全因为只操作副本,缺点就是不能改变实参内容
        按地址传递:拷贝实参的地址(地址在内存中是唯一的),形参一定能通过实参的地址访问实参的空间
    }
    
    数组作为函数的参数:{
        直接传递数组的地址是无法确定数组大小,一定要传递数组的大小作为参数
    }
}


指针函数:{
    返回值是一个指针的函数
    char *func(参数列表);
    
    练习:
        (1) 编写strcat函数,不适用任何库函数。函数原型:char *MyStrcat(char *dst, const char *src);
        (2) 为什么需要char *作为返回类型
            因为要满足链式表达式
            
    练习2:
        编写strcpy函数
        
    练习3:
        编写strcmp函数
}

函数指针:{
    函数是有地址的,可以存放在指针变量里面
    int *p = &func;
    *p        //无法实现函数调用
    
    特殊的指针:函数指针
    int (*pfunc)(参数列表);
    
    int add(int a, int b){}
    int (*pf)(int,int);
    
    函数的名字就是函数的地址,对函数的名字取地址也是一样的效果
}

函数指针数组:{
    int (*pfunc[])();
    
    typedef int (*pfunc)();
    pfunc arr[];
}

typedef:{
    重命名
    typedef unsigned int _uint32;
    
    typedef char data_t;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值