最全C语言个人笔记【第一章节-环境搭建-C语言入门】

1.c语言开发环境搭建

c语言可以在windows、Linux(Ubuntu)或者苹果系统中开发,不同的操作系统都有不同的各种各样的工具比如vsCode、Visual Studio、qtCreator、ubuntu

在这里插入图片描述

  • vsCode(点击下载

    • 几乎所有的功能都由插件提供,需要什么装什么,轻量,丝滑,极速,备受赞誉的编程神器
    • 可以在windows、mac、linux中使用
  • Visual Studio (点击下载)

    • 领先于业界的数据库工具
    • 丰富的分支功能支持并行开发,允许多个团队同时开发一个应用程序的多个版本,从而提高了整体的效率。
  • QtCreator (点击下载)

    • 嵌入式最流行GUI库–Qt的编程IDE,支持纯C语言、纯C++编程
    • 跨平台,可以在windows、ubuntu、mac系统中使用
  • ubuntu命令行

    • 直接在ubuntu中采用终端编程,使用原生的纯Linux系统环境
    • 终端编程一般指的是直接使用诸如vim,gcc等命令工具进行编程
  • 本章着重搭建C语言程序开发的一个最容易上手的编程环境VSCode,其余软件和环境可在课程《Linux基础》中的

    相关章节深入了解。

    2.vsCode

    2.1简介

    vsCode 全称 Visual Studio Code,是微软出的一款轻量级代码编辑器, 免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比Diff、版本管理GIT等特性,支持插件扩展,并针对网页开发和云端应用开发做了优化。软件跨平台支持 Win、Mac 以及 Linux。

在这里插入图片描述

vsCode打开大文件启动特别快,几乎跟纯编辑器无异,这种丝滑感是vsCode登顶全球编程类工具顶流的重要原因,它受欢迎的另一个杀手锏是其无比丰富的插件库,vsCode本质上是个框,一个大大的框,什么都能往里装,我们能想到的几乎任何功能,都能找到vsCode支持的插件,可以完全定制我们自己喜欢的功能。

下面是vsCode安装完成之后的样子:

在这里插入图片描述

2.2安装部署cygwin

Cygwin是一个在windows平台上运行的类 UNIX 模拟环境,是cygnus solutions公司开发的自由软件。它对于学习UNIX/Linux操作环境,或者从UNIX到Windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用GNU工具集在Windows上进行嵌入式系统开发,非常有用。

​ 1.下载

cygwin64

​ 2.解压

​ 获取cygwin64解压之后得到的bin文件夹的路径(不能含有中文),例 如:

在这里插入图片描述

设置环境变量

​ 将上述路径设置到系统环境变量当中。依次点击“我的电脑”

​ “属性”,“高级系统设置”,弹出一下窗口后,点击“环境变量”

在这里插入图片描述

​ 在弹出的窗口中,选择系统变量中的 Path 环境变量,点击编

​ 辑、新建一个路径,将 cygwin\bin 所在的路径(不能含中文)

​ 加到 Path 环境变量中,如下图所示:

在这里插入图片描述

注意,在 Windows7 以前的老系统中,点击环境变量 Path 的编辑按钮后弹出的输入框比较小,而且里面的各个路径是用英文分号分开,将 cygwin/bin 所在路径加入变量值即可,如下图所示:

在这里插入图片描述

Windows-7 的配置环境变量的界面

  1. 测试
    按win+r打开运行窗口,输入cmd打开命令终端,输入gcc -v测试配置是否生效:

在这里插入图片描述

2.3 安装C/C++插件

vsCode的所有插件,都可以在左侧栏的“Extension(扩展)”中直接安装,如下图所示:

在插件库中输入C/C++,就可以看到所需安装的插件,C/C++插件主要提供命令推理、自动补齐、语法高亮等功能,如下图所示:

在这里插入图片描述

在vsCode插件库中找到C/C++插件

一般而言,直接点击“Install”并重启 vsCode 即可,但有些时候可能会因为网络问题而导致无法自动下载,使得安装失败,比如出现如下情况:

在这里插入图片描述

插件下载卡顿

这时可以通过离线的插件包到本地电脑安装:

  • 点击下载C/C++离线插件包:cpptools-win32.vsix
  • 按 ctrl+shift+p 打开 vsCode 命令面板,输入 install,点击 “扩展:从 VSIX 安装:

在这里插入图片描述

离线安装 C/C++ 插件

2.4 安装 Code Runner 插件

为了更加方便地使用 vsCode,安装 Code Runner 插件可以一键编译和运行,在 vsCode 的扩展侧栏中输入 run 即可看到该插件,如下图所示:

在这里插入图片描述

安装 Code Runner 插件

注意
Code Runner默认没有在终端输入输出,这可能会在需要使用终端输入输出的程序中产生一些不必要的困扰,为了方便,一般可配置该插件输入输出为终端:

在这里插入图片描述

配置 Code Runner

3. 使用vsCode

在部署好了 cygwin、C/C++、Code Runner 等增强插件之后,就可以在 vsCode 中愉快地编辑编译C语言程序了,具体步骤如下:

3.1 启动

启动 vsCode 并打开新窗口,点击打开文件夹。或者可以直接将文件夹拖进 vsCode。

在这里插入图片描述

直接将文件夹拖进 vsCode 即可开始编程

3.2 创建源代码

点击左侧栏的新建文件,开始编程程序:

在这里插入图片描述

新建文件

3.3 编译程序

由于已经安装了 Code Runner 插件,因此可以点击编辑框右上角的三角形来一键编译和运行:

在这里插入图片描述

一键运行

运行程序时自动展开的是终端调试窗,可以通过快捷键 ctrl + ` 来打开和关闭。另外,除了一键编译运行之外,也可以在终端中使用命令来分开控制编译和运行,在终端中使用如下指令来进行操作:

# 编译程序
gcc example.c -o example

# 运行程序
./example

在这里插入图片描述

用命令的方式编译和运行程序

vscode设置自动保存程序

在这里插入图片描述

vscode设置滚轮字体缩放

在这里插入图片描述

在这里插入图片描述

2.c语言入门

大纲

1.C语言入口main()、数据类型、变量、赋值

2、ascii码、表达式、运算符(位运算符)

3.分支流、控制流

4.数组、一维数组、二维数组、指针数组、函数指针、字符串数组 字符数组

5.指针、一级指针、二级指针、野指针、空指针

6.函数的定义、调用、声明、静态函数、字符串函数,内联函数、递归函数

7.内存管理,作用域,存储期

8.结构体、枚举、共用体

9.头文件、工程管理文件

c语言特点

c语言是强类型语言,编译和执行效率高
表达方式简练、实用。
具有低级语言的特点。
是一种结构化语言,适合于大型程序的模块化设计
各种版本的编译系统都提供了预处理命令和预处理程序。
可移植性好。
生成的目标代码质量高。代码运行效率高比汇编质量低10-20%

c语言工作岗位

STM32开发
linux驱动开发
linux移植
嵌入式软件开发
c语言开发

如何学习c语言

1. 从内存的角度去分析,比如int a = 10 的本质是  申请一块内存取名为a,然后将10放到这块内存
2. 熟悉语法
3. 多刷力扣题,笔试题,各种算法题
4. 多写博客,博客园,CSDN做笔记
5. 多去github 或者 gitbee阅读优秀的源码,比如2048,或者五子棋,俄罗斯放快,象棋等项目

1. Hello World

置部署好 vsCode 之后,就可以直接在上面写代码了,新建一个新的C程序文件,向屏幕输出一串字符 “Hello World!”,如下图所示:

在这里插入图片描述

最简单的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):main是函数名,这个名字不能被挪作他用
//				void是函数参数列表,可以省略
int main(void)
{
    printf("我在学校吃饭,睡觉,打游戏,就是不学习");
}

在Linux环境下,主函数main根据程序最终是否需要接收外部命令行参数,实际有两个版本:

// 不能接收外部命令行参数的版本
int main()
{
    ...
}
// 接收外部命令行参数的版本
int main(int argc, char **argv)
{
    ...
}

在初学阶段,不可理会带外部参数的版本,等到学完数组和指针再回过头来复习即可。

demo

#include <stdio.h>
#include "test.h" // 所有子函数的声明(提前登记函数名)都放在头文件

// 函数名就是函数的入口地址
void bozhouxueyuan()
{
    printf("学校就是学习的地方\n");
}

int ktv()
{
    printf("ktv就是唱歌的地方\n");
    return 100;
}

void home(char *name) // 形参
{
    printf("%s在家里面睡大觉\n",name);
}


// 程序入口
// 一个程序只有一个main函数

// 函数的本质是一个一个模块,每个模块可以放在一个c文件或多个c文件,它们之间没有任何关系
// 函数和函数之间不是包含关系,不能再函数里面{},定义另一个函数
/* 函数的组成
    1. {}作为函数体,表示函数的范围,在函数体内有效
    2. int 表示函数的返回值类型,和return 后面的数据类型相同,比如return 0,那么函数名前面就写int
    3. 函数名 如果是main表示主程序的入口地址,一个项目有且只有一个main,起始函数名相当与这个函数的入口地址
    4. () 表示函数参数,别人给你传递的内容

*/
int main()
{
    //void func(void){} // 错误,不要这么写

    bozhouxueyuan; // == 安徽省亳州市谯城区汤王大道2266号
    printf("%p\n",bozhouxueyuan);
    bozhouxueyuan();
    int money = ktv();
    printf("去ktv花了%d\n",money);
    home("jack"); // 实参
    return 0; // 程序结束标记
}


2.3 printf函数

C语言被称为是一种面向过程的模块化语言,所谓的模块,指的是一个个功能明确,各司其职的封装函数,

它们就像一块块积木,被合理有机的拼搭起来,形成复杂健壮的程序。

在这之中,系统标准C库提供了非常多的"模块”,printf就是其中之一,他的功能就是:向终端输出一段指定格式的数据。

// 向终端输出一段字符串
printf("hello world!\n");

printf原型

格式输出控制符
  • 概念:函数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", 100"abcd"); // 输出字符串
    
  • 语法点:

    • 类似%d、%f被称为格式控制符
    • 一个格式控制符对应一个数据
    • '\n’是一个字符,表示回车符,详细ASCII码表
  • 格式控制符:

    1. 十进制整数:%d
    printf("%d\n",123); // 整数用%d输出,'\n'回车换行
    

    2.八进制整数:%o

    printf("%#o\n",8); // 整数用%#o输出,显示前缀'\n'回车换行
    
    1. 十六进制整数:%x
    printf("%#x\n",10); // 整数用%#x输出,显示前缀'\n'回车换行
    
    1. 字符:%c
    printf("%c\n", 'x');          // 输出字符
    
    1. 字符串:%s
    printf("%s\n", "abcd");       // 输出字符串
    
    1. 单精度浮点数:%f
    printf("%.10f\n", 3.1415926589);         // 输出浮点数
    
    1. 双精度浮点数:%lf
    printf("%.10lf\n", 3.1415926589);         // 输出浮点数
    
    1. 长双精度浮点数:%Lf long double
    printf("%.10lf\n", 3.1415926589);         // 输出浮点数
    
    1. 地址:%p

demo:

#include <stdio.h>

void test(void){}

int main(void)
{
    // 十进制输出
    printf("%d\n",-100);
    printf("%u\n",200);
    printf("%d\n",1000000);
    printf("%ld\n",100L);// 长整型
    printf("%lu\n",100UL); // 无符号长整型

    // 八进制输出
    printf("%#o\n",200);

    // 十六进制输出
    printf("%#x\n",200);

    // 字符串
    //char buf[4] = {'a','b','c','\0'};
    // %s 是从字符串的首元素地址开始遍历,直到遇到'\0'结束
    // 字符串常量"abc"默认是添加\0结尾
    printf("%s\n","abc");

    // 字符
    // 字符a是常量,千万不要把''去掉
    printf("%c\n",'a');

    // 浮点
    printf("%f\n",3.14);
    // 保留小数点后两位
    printf("%.2f\n",3.14);

    printf("%.10lf\n",3.1415926789);

    // 地址
    // 输出主函数地址
    printf("%p,%p\n",main,test);
    
    return 0;
}

2.4 return语句

c语言中的关键字return的含义是结束一个函数,并返回某个数据(若有)

而具体到main函数中时,由于主函数mian的结束同时也意味着整个程序的结束,因此在上述hello world程序中return后整个程序就退出了。

int main()
{
    ... ...
    //  一般而言,函数正常退出返回0,非正常退出返回非0
    return 0}

一般而言,程序正常退出时,main函数返回值是0;当程序异常退出时,main函数返回值是非0。

注意,main函数的返回值是给上一级进程(运行中的程序)的,因此理论上讲在当前的单进程程序中,main函数的返回值究竟是多少都无所谓,因为根本没有去使用这个返回值,除非在多进程程序中,进程间才需要使用main函数的返回值来传递信息。

「课堂练习1」

使用vscode编写一段代码,显示自己的学校和姓名

解答
本题主要考察 vsCode 软件的安装和配置。

#include <stdio.h>

int main()
{
    printf("齐鲁大学:张三疯\n");
    return 0;
}

3 man帮助手册

编程开发过程中,需要使用众多的系统指令,各类函数库、系统调用、各类系统脚本文件等,这些种类繁多、功能各异的信息,可以通过统一的man手册来获取第一手资料,man文档是帮助信息的权威通道,是大多数教程、书籍的知识来源。

由于man手册所需要罗列的帮助条目众多,因此man手册被妥善的分为9册,不同的帮助信息被放入对应的man手册中:

  • man文档的九个分册:
    1. Shell命令(默认已经安装)
    2. 系统调用
    3. 库函数
    4. 特殊文件(通常出现在/dev目录下)
    5. 文件的特殊格式或协定(例如/etc/password的格式)
    6. 游戏
    7. 杂项(例如一些宏定义)
    8. 系统管理员命令(通常只能由管理员执行)
    9. 非标准内核例程

3.1 man手册的安装

在默认情况下,系统只安装第一册,其他的帮助信息一般需要用户自己手动安装,安装指令如下:

vstc@ubuntu:~$ sudo apt install manpages-zh
vstc@ubuntu:~$ sudo apt install manpages-dev
vstc@ubuntu:~$ sudo apt install manpages-posix 
vstc@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函数的用法,并编写一个程序试试它的效果。

在这里插入图片描述

fork()  creates  a new process by duplicating the calling process.  The new process is referred to
       as the child process.  The calling process is referred to as the parent process.
//fork()通过复制调用进程来创建新进程。这个新进程称为子进程。调用进程称为父进程。
// 通过查阅代码,得知 fork 函数专用于创建一个新的进程,可以让原有的进程“分裂”成两个一模一样的进程,也就是有两个进程执行 fork 后续的代码。可以用下面的代码简单地验证这个结论:
The child process and the parent process run in separate memory spaces.  At  the  time  of  fork() both  memory spaces have the same content.  Memory writes, file mappings (mmap(2)), and unmappings(munmap(2)) performed by one of the processes do not affect the other.
//子进程和父进程在单独的内存空间中运行。在fork()时,两个内存空间具有相同的内容。其中一个进程执行的内存写入、文件映射(mmap(2))和取消映射(munmap(2))不会影响另一个进程。
#include <stdio.h>

int main()
{
    fork();           // 将本进程分裂为两个进程
    printf("abcd\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);
    )
    
    系统原有的头文件要用尖括号,自定义的头文件采用双引号,因此第一行要改成 <stdio.h>
    C语言主函数返回值类型为整型,参数列表可以为空,改成: int main()
    函数主体必须使用大括号括起来
    代码块必须要缩进
    浮点数的科学计数法中的e或E前面必须有数字,因此 e21 是错误的,可以改成1e21 == 10^21
    题目中rate是未初始化的变量,因此其值是无意义的
    
  • 问:老师,可以用DEV-C++、vc++、virtual studio等软件来写C语言程序吗?

  • 答:可以。用什么IDE编辑编译C语言程序,理论上都是可以的,C语言的核心语法都是一样的,但由于嵌入式课程的核心技术之一是Linux,因此在Linux环境下编写C语言代码是最好的方式,推荐直接在Linux系统中写代码,或者在 Windows 下安装带有Cygwin环境的 vsCode 都是可以的。

  • 问:老师,需要安装虚拟机吗?

  • 答:可以,如果电脑硬件资源配置足够,安装虚拟机并在上面运行Linux系统直接进行C语言编程当然是可以的,在后续的嵌入式学习中,纯Linux的编程开发是必备的技能,只不过在初学C语言阶段,在电脑硬件配置不足的情形下,可以不必安装虚拟机的。

VI练习

解析
直接在 vsCode 中的扩展栏搜索 vim 安装即可。关于 vi 编辑器:

  • 特点:

    1. vi的改进版本叫vim(vi’s improved version),vi和vim是同一个软件。
    2. vi其初衷是解放鼠标,只用键盘高效操作所有的编辑任务。
    3. 没有菜单,操作分成编辑模式和命令模式,除了编辑之外的操作都在命令模式下进行。
  • 模式切换:

    1. 从命令模式 切换到 编辑模式:按i、o、a、I、O、A均可
    2. 从编辑模式 切换到 命令模式:按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)

(基本程序入门,帮助信息查询)
【2】通过查询本地man手册,或者在线帮助文档,了解格式控制输出函数的用法,编写程序实现:

  1. 输出123.456,并保留1位小数
  2. 输出十进制数100的十六进制形式,并附上十六进制数的前缀(即0x)

提示:在线帮助文档

作业:

1.完成课堂练习2

2.阅读华为编程规范

3行 |
| x | 剪切光标所在的字符 |
| r | 替换当前字符 |
| p | 粘贴 |
| u | 撤销 |
| ctrl+r | 恢复撤销 |
| k | 光标向上移动 |
| j | 光标向下移动 |
| h | 光标向左移动 |
| l | 光标向右移动(小写的L) |

(基本程序入门,帮助信息查询)
【2】通过查询本地man手册,或者在线帮助文档,了解格式控制输出函数的用法,编写程序实现:

  1. 输出123.456,并保留1位小数
  2. 输出十进制数100的十六进制形式,并附上十六进制数的前缀(即0x)

作业:

1.完成课堂练习2

2.阅读华为编程规范

3.将上面的printf例子写一写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值