c语言大纲
1.C语言入口main()、数据类型、变量、赋值
2、ascii码、表达式、运算符(位运算符)
3.分支流、控制流,循环
4.数组、一维数组、二维数组、指针数组、函数指针、字符串数组
5.指针、一级指针、二级指针、野指针、空指针
6.函数的定义、调用、声明、静态函数、字符串函数(strcpy,memcpy,strstr,strcat),内联函数、递归函数
7.内存管理,作用域,存储期
8.结构体、枚举、共用体(联合体)
9.头文件、工程管理文件
1. Hello World
置部署好 vsCode 之后,就可以直接在上面写代码了,新建一个新的C程序文件,向屏幕输出一串字符 “Hello World!”,
如下程序所示:
#include <stdio.h>
int main
(int argc,char const *argv[])
{
printf("helloword\n");
return 0;
}
最简单的Hello World程序
下面,从整体来分析一下这个最简单的c语言程序,将这个最简单程序的各个部分刨析清楚,明白我们写下的灭个字符的具体含义。
2. 程序的基本结构
2.1 头文件
#include <stdio.h>
1.c语言程序中,任何字符(包括变量和函数)的使用,都是需要提前声明的。
2.如果程序用到了系统库函数,那么就需要包含相应的系统头文件进行声明。
3.上述代码中用到了库函数printf,而这个函数的声明在头文件stdio.h中,因此在改程序中需要包含此头文件。
声明
-
概念:对源文件外定义的某个符号进行描述的过程,称为声明
-
作用:经过声明的符号,编译器才能正确识别和编译,否则编译器不认识,无法判定语法错误
-
符号:变量、函数等
-
示例:
// 声明一个变量符号number int number = 100; // 声明一个函数符号printf int printf(const char *format, ...);
2.2 主函数
1.主函数是必须要有的,每一个语言程序都有main函数,哪怕是空的。
2.主函数的名字是固定的,叫main,这个函数名不可被挪作他用。
3.主函数是程序的入口,也就是程序开始运行的地方。
4.主函数分解如下:
// int:返回值类型,代表主函数最终的执行结果是一个整型数据
// main(void):mian是函数名,这个名字不能被挪作他用
// void是函数参数列表,可以省略
int main(void)
{
}
在Linux环境下,主函数main根据程序最终是否需要接收外部命令行参数,实际有两个版本:
// 不能接收外部命令行参数的版本
int main()
{
...
}
// 接收外部命令行参数的版本
int main(int argc, char **argv)
{
...
}
在初学阶段,不可理会带外部参数的版本,等到学完数组和指针再回过头来复习即可。
2.3 printf函数
C语言被称为是一种面向过程的模块化语言,所谓的模块,指的是一个个功能明确,各司其职的封装函数,
它们就像一块块积木,被合理有机的拼搭起来,形成复杂健壮的程序。
在这之中,系统标准C库提供了非常多的"模块”,printf就是其中之一,他的功能就是:向终端输出一段指定格式的数据。
// 向终端输出一段字符串
printf("hello world!\n");
格式输出控制符
-
概念:函数printf被称为格式化IO函数,因为它事按照指定格式来操作数据的。以常见的整数,浮点数和字符串为例,printf函数相关的控制格式符如下所示:
//格式化输出函数 printf(); // 根据需要输出不同格式的数据 printf("%d\n", 100); // 输出1个整数 printf("%d, %d\n", 100, 200); // 输出2个整数 printf("%f\n", 3.14); // 输出浮点数 printf("%c\n", 'x'); // 输出字符 printf("%s\n", "abcd"); // 输出字符串 printf("a=%d, %s\n", "abcd"); // 输出字符串
-
语法点:
- 类似%d、%f被称为格式控制符
- 一个格式控制符对应一个数据
- '\n’是一个字符,表示回车符,详细ASCII码表
-
格式控制符:
- 十进制整数:%d
printf("%d\n",123); // 整数用%d输出,'\n'回车换行
2.八进制整数:%o
printf("%#o\n",8); // 整数用%#o输出,显示前缀'\n'回车换行
- 十六进制整数:%x
printf("%#x\n",10); // 整数用%#x输出,显示前缀'\n'回车换行
- 字符:%c
printf("%c\n", 'x'); // 输出字符
- 字符串:%s
printf("%s\n", "abcd"); // 输出字符串
- 单精度浮点数:%f
printf("%.10f\n", 3.1415926589); // 输出浮点数
- 双精度浮点数:%lf
printf("%.10lf\n", 3.1415926589); // 输出浮点数
- 长双精度浮点数:%Lf long double
printf("%.10lf\n", 3.1415926589); // 输出浮点数
-
地址:%p
printf("%p","jack"); // 输出"abc"的地址
2.4 return语句
c语言中的关键字return的含义是结束一个函数,并返回某个数据(若有)
而具体到main函数中时,由于主函数mian的结束同时也意味着整个程序的结束,因此在上述hello world程序中return后整个程序就退出了。
int main()
{
... ...
// 一般而言,函数正常退出返回0,非正常退出返回非0
return 0;
}
一般而言,程序正常退出时,main函数返回值是0;当程序异常退出时,main函数返回值是非0。
注意,main函数的返回值是给上一级进程(运行中的程序)的,因此理论上讲在当前的单进程程序中,main函数的返回值究竟是多少都无所谓,因为根本没有去使用这个返回值,除非在多进程程序中,进程间才需要使用main函数的返回值来传递信息。
总结
// 没有头文件不会出现编译错误,但是会出现编译警告,提示隐式声明
// extern的意思是函数声明,告诉编译器等一下我使用printf的时候不要警告
// extern int printf (const char *__restrict __format, ...);
// extern int scanf (const char *__restrict __format, ...) __wur;
#include <stdio.h>
// main是程序的入口地址,公司老板
int main()
{// 程序工作的范围,边界,不能离开{}独立工作,所以,一个工程只有一个main
// 函数,函数其实就是帮我们实现某个功能
// printf帮我们输出hello到屏幕
printf("hello\n");
int a;
scanf("%d",&a);
return 0; // 程序结束,return 0表示正常退出
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("hello wrold\n");
// %d格式输出符表示输出的内容是整数
printf("%d,%d\n",100,100); //输出整数
printf("0%o\n",100); // 八进制输出
printf("0x%x\n",100); // 十六进制输出
printf("%c\n",'a');// 输出字符
printf("%s\n","abc"); // 输出字符串
printf("%d,%c,%s\n",200,'b',"abc"); //输出整数,字符,字符串
printf("%f\n",3.14); // 输出单精度小数
printf("%lf\n",3.1415926);// 输出双精度小数
printf("%.6lf\n",3.1415925);// %.6表示输出小数点后6位,注意进位
printf("%p","jack"); // 输出"abc"的地址
return 0;
}
练习1
使用vscode编写一段代码,显示自己的学校和姓名
解答
本题主要考察 vsCode 软件的安装和配置。
#include <stdio.h>
int main()
{
printf("齐鲁大学:张三疯\n");
return 0;
}
3 man帮助手册
编程开发过程中,需要使用众多的系统指令,各类函数库、系统调用、各类系统脚本文件等,这些种类繁多、功能各异的信息,可以通过统一的man手册来获取第一手资料,man文档是帮助信息的权威通道,是大多数教程、书籍的知识来源。
由于man手册所需要罗列的帮助条目众多,因此man手册被妥善的分为9册,不同的帮助信息被放入对应的man手册中:
- man文档的九个分册:
- Shell命令(默认已经安装)
- 系统调用
- 库函数
- 特殊文件(通常出现在/dev目录下)
- 文件的特殊格式或协定(例如/etc/password的格式)
- 游戏
- 杂项(例如一些宏定义)
- 系统管理员命令(通常只能由管理员执行)
- 非标准内核例程
3.1 man手册的安装
在默认情况下,系统只安装第一册,其他的帮助信息一般需要用户自己手动安装,安装指令如下:
gec@ubuntu:~$ sudo apt install manpages-zh
gec@ubuntu:~$ sudo apt install manpages-dev
gec@ubuntu:~$ sudo apt install manpages-posix
gec@ubuntu:~$ sudo apt install manpages-posix-dev
3.2 man手册的查询
使用man手册查询命令、函数时,一般直接在man后面接上待查条目即可,但有时候会遇到同一个待查询的条目存在于多个man分册的情况,这就需要先罗列出该条目所在的分册信息,然后再根据需要去选择帮助文档的序号。
// 查询存在于多个分册的条目:
// 先使用-f来查看有哪些分册包含了条目
gec@ubuntu:~$ man -f printf
printf (1) - format and print data
printf (3posix) - print formatted output
// 根据需要,指定查询某一册帮助分册
gec@ubuntu:~$ man 3posix printf
注意:
按 q退出
练习2
使用man手册查询系统调用fork函数的用法,并编写一个程序试试它的效果。
#include <stdio.h>
#include <unistd.h>
int main()
{
int num;
printf("请输入一个大于0的数:");
scanf("%d", &num);
for (int i = 0; i < num; i++)
{
fork();
printf("Hello, World!\n");
}
return 0;
}
4. 代码风格规范
-
缩进:凡是有代码块的地方都必须缩进,一对大括号{}代表一个代码块
-
空格:标点符号后面,一般加空格
-
空行:不同逻辑段落中间,一般加空行
-
符号命名:尽量能一望便知,做到顾名思义,避免使用无意义字符
// 示例代码 #include <stdio.h> #include <stdlib.h> int maxValue(int a, int b) { return a>b ? a : b; } int main(void) { int a; int b; int m = maxValue(a, b); printf("最大值是: %d\n", m); return 0; }
练习3
麻花疼同学写了下面这个程序,请指出你认为不妥的地方。
#include "stdio.h" main{} ( float g; h; float tax, rate; g = e21; tax = rate * g; printf("%f\n", tax); )
-
问:老师,可以用DEV-C++、vc++、virtual studio等软件来写C语言程序吗?
-
答:可以。用什么IDE编辑编译C语言程序,理论上都是可以的,C语言的核心语法都是一样的,但由于嵌入式课程的核心技术之一是Linux,因此在Linux环境下编写C语言代码是最好的方式,推荐直接在Linux系统中写代码,或者在 Windows 下安装带有Cygwin环境的 vsCode 都是可以的。
-
问:老师,需要安装虚拟机吗?
-
答:可以,如果电脑硬件资源配置足够,安装虚拟机并在上面运行Linux系统直接进行C语言编程当然是可以的,在后续的嵌入式学习中,纯Linux的编程开发是必备的技能,只不过在初学C语言阶段,在电脑硬件配置不足的情形下,可以不必安装虚拟机的。
VI练习
解析
直接在 vsCode 中的扩展栏搜索 vim 安装即可。关于 vi 编辑器:
-
特点:
- vi的改进版本叫vim(vi’s improved version),vi和vim是同一个软件。
- vi其初衷是解放鼠标,只用键盘高效操作所有的编辑任务。
- 没有菜单,操作分成编辑模式和命令模式,除了编辑之外的操作都在命令模式下进行。
-
模式切换:
- 从命令模式 切换到 编辑模式:按i、o、a、I、O、A均可
- 从编辑模式 切换到 命令模式:按Esc。
在编辑模式中,vi 就跟普通的编辑器一样
在命令模式中,可以输入如下命令操作文本:
命令 | 效果 |
---|---|
:w | 保存 |
:wq | 保存并退出 |
:q! | 放弃保存并退出 |
i | 在当前光标处插入文本,进入编辑模式 |
I | 在当前光标所在行的开头处插入文本,进入编辑模式 |
a | 在当前光标的下一个字符处插入文本,进入编辑模式 |
A | 在当前光标所在行的末尾处插入文本,进入编辑模式 |
o | 在当前光标的下一行插入文本,进入编辑模式 |
O | 在当前光标的上一行插入文本,进入编辑模式 |
yy | 复制光标所在行 |
3yy | 复制光标所在行及以下3行 |
dd | 剪切光标所在行 |
3dd | 剪切光标所在行及以下3行 |
x | 剪切光标所在的字符 |
r | 替换当前字符 |
p | 粘贴 |
u | 撤销 |
ctrl+r | 恢复撤销 |
k | 光标向上移动 |
j | 光标向下移动 |
h | 光标向左移动 |
l | 光标向右移动(小写的L) |