c语言程序设计

本文介绍了C语言的基础知识,包括数据类型、控制流、数组、指针、函数以及内存管理。强调了main函数作为程序入口的重要性,printf函数的使用以及头文件的作用。还提到了代码风格规范和在VSCode中编写C程序的方法,以及如何利用man手册查询系统调用和函数用法。
摘要由CSDN通过智能技术生成

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码表
  • 格式控制符:

    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

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

#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 编辑器:

  • 特点:

    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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值