超详细最全C语言个人笔记【第一章节】

c语言大纲

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

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

3.分支流、控制流

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

5.指针、一级指针、二级指针、野指针、空指针,函数指针,数组指针

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

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

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

9.头文件、工程管理文件(makefile)

补充:ubuntu设置共享文件夹

ubutnu进入共享文件夹

cd /mnt/hgfs/xxxx(自行设置的windows的共享目录)

ubuntu编译程序

gcc hello.c -o hello

ubuntu执行程序

./hello

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):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", 19,"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

2.4 return语句

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

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

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

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

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

「几个总结的练习」

使用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手册的安装

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

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函数的用法,并编写一个程序试试它的效果。

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" // ""错误,< >:stdio.h是存在标准库,""是自定义头文件,默认在程序当前目录寻找
     main{}//{}-->()
    (//(-->{
    float g; h; //g,
    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)

提示:在线帮助文档

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言指针是C语言中非常重要的概念,它是程序设计中最基本的数据结构之一。指针可以用于在程序中访问和操作内存中的数据,它们是C语言中最强大、最灵活的工具之一。在本篇笔记中,我们将介绍C语言指针的基本概念和用法。 1. 指针的概念 指针是一个变量,它存储了一个内存地址。在C语言中,每个变量都有一个内存地址,指针可以用来指向这个地址。通过指针,我们可以访问和操作内存中的数据,这使得C语言非常灵活和强大。 2. 定义指针变量 在C语言中,定义指针变量有两个步骤。第一步是声明指针变量的类型,第二步是用"&"符号取得一个变量的地址,并将这个地址赋给指针变量。例如: ```c int num = 10; //定义一个整型变量num int *p; //声明一个指针变量p p = &num; //将num的地址赋给指针变量p ``` 这样,指针变量p就指向了变量num的地址。 3. 操作指针变量 有了指针变量之后,我们可以通过指针变量访问和操作内存中的数据。例如,要访问变量num的值,可以通过指针变量p来实现: ```c printf("num的值为:%d", *p); //输出num的值 ``` 在这个例子中,通过"*"符号来访问指针所指向的内存中存储的值。这个符号被称为“解引用符号”,它可以用来访问指针所指向的内存中存储的值。 4. 指针的运算 指针可以进行加、减运算,这种运算是基于指针的类型和指针所指向的内存的大小进行的。例如,如果定义了一个指向整型的指针变量p,那么p+1将指向下一个整型变量的地址。同样的,p-1将指向上一个整型变量的地址。 此外,指针还可以用来访问数组中的元素。例如: ```c int arr[5] = {1, 2, 3, 4, 5}; //定义一个整型数组 int *p; //声明一个指针变量 p = arr; //将数组的首地址赋给指针变量 printf("arr[0]的值为:%d", *p); //输出数组第一个元素的值 ``` 在这个例子中,将数组的首地址赋给了指针变量p,然后通过解引用符号来访问数组中的元素。 5. 指针的应用 指针是C语言中非常重要的概念,它可以用于很多方面。例如,可以通过指针来动态分配内存空间、访问硬件设备、实现复杂的数据结构等等。 总之,指针是C语言中非常重要的概念,程序员需要深入理解它的概念和用法,才能够在程序设计中发挥其强大的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值