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语言补习过程中知识点的总结
预处理-->编译-->汇编-->链接
预处理:gcc -E file 展开头文件,进行宏替换 生成.i文件
编 译:gcc -S file 查找语法错误 生成.s文件
汇 编:gcc -c file 把汇编代码解释成二进制文件 生成.o文件
链 接:gcc file.o 链接程序运行时一些必要的库 生成.o文件
助记方式
键盘上的esc按键对应预处理编译和汇编的命令;其对应生成的文件后缀为iso(镜像文件后缀)。
将变量存入静态缓存区;
修饰局部变量时:生命周期延长,作用域不变;
修饰全局变量时:生命周期不变,作用域被限制;
修饰函 数时:生命周期不变,作用域被限制;
break:跳出当前所在的控制;
continue:跳出本次控制(循环);
return:结束函数模块,并且可以返回一个值;
内存是由多个内存单元组成,每个单元都由一个或多个字节组成,每个字节都有唯一编号,我们叫这个编号为地址;
地址就是指针;
指针变量的数据类型是由指向空间的类型决定的。
const 修饰指针:
const int *p :指针指向空间的内容无法修改,只读;
int *const p :指针的指向无法修改;
数组是一些相同类型的集合;存储上是一片连续的存储空间。
使用时需要注意不能越界,
二维数组:
多个相同类型的一维数组的集合,储存上也时一片连续的空间。
注意:二位数组的行和列是为了方便理解而抽象出来的,实际上其在内存空间中的存储是线性的。
一维数组的数组名就是数组的指针,指向数组的首元素的地址,但是数组名是常量,不能更改,也不能进行自加和自减。
数组指针:也称行指针;本质是指针,指向二维数组的每一行的首元素的指针;
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;
}