C语言知识导航

前言

C语言是大多数计算机本科生学习的第一个编程语言,是其他编程语言的基础,重要性不言而喻。而我基于网上的相关资料,总结了一个C语言知识导航供大家参考,大家可以根据这个导航来作为辅助进行C语言学习。

C语言

C语言(英语:C Language)是一种通用的、过程式编程编程语言,支持结构化编程、词法作用域和递归,使用静态类型系统,并且广泛用于系统软件应用软件的开发。

C语言于1969年至1973年间,为了移植与开发UNIX操作系统,由丹尼斯·里奇肯·汤普逊,以B语言为基础,在贝尔实验室设计、开发出来。二十世纪八十年代,C语言应用日渐广泛。为了避免各开发厂商用的C语言的语法产生差异,美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言的标准。与此同时,国际标准化组织也接受该标准为国际标准。因此,ANSI C也同时被称为ISO C。二十世纪八十年代至今的有关程序开发工具,一般都支持符合ANSI C的语法。

C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐,成为最近25年使用最为广泛的编程语言。目前,C语言编译器普遍存在于各种不同的操作系统中,例如Microsoft WindowsmacOSLinuxUnix等。C语言的设计影响了众多后来的编程语言,例如C++Objective-CJavaC#等。现行的许多软件都是由C语言或者其影响和派生的编程语言开发出来的。

ALGOL一族的大多数过程式编程语言类似,C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。其采用的静态类型系统可以防止无意的程序设计操作。C语言中所有的可执行代码都被包含在子程序(函数)里。其传递参数均是以值传递(pass by value),另外也可以传递指针(a pointer passed by value)。C语言是自由形式语言,即其源代码的缩进并不影响程序的功能,而是使用分号作为语句的结尾,花括号来表示代码块

由于C语言的语言规模较小,若干高层的机制需要使用定义的函数来提供。比如,C语言并没有直接处理复合对象(例如字符串、集合、列表、数组等)的操作,也没有对于存储器分配工具和内存回收工具的直接定义,同时也本身不具有输入和输出以及文件访问的方法。然而,用户定义的函数和C语言标准库中的函数为这些高层的机制提供了可能性。

C语言也具有以下的特性:

  • 基本数据类型包括字符、整型和浮点数等。另外也有派生的各种数据类型,如指针数组、结构和联合。
  • 部分的变量类型可以转换,例如整数型和字符型变量。
  • 透过指针(pointer),C语言可以容易的对存储器进行低端控制。
  • 不同的变量类型可以用结构体(struct)组合在一起。
  • 具有基本的控制流:语句组、条件判断、多路选择、循环等。
  • 函数可以返回各种数据类型的值,并且都可以递归调用。每次调用函数会重新创建变量。
  • C语言只有32个保留字(reserved keywords),使变量、函数命名有更多弹性。
  • 编译预处理(preprocessor)让C语言的编译更具有弹性。

语法

C语言的语法相对简洁而直接。C语言的形式文法国际标准化组织所制定。简单来说,C语言包括如下文法:

  1. 作为一种指令式编程语言,C语言使用语句执行操作。最常见的语句是表达式语句,由一个表达式后加一个分号组成,可以令系统调用函数和为变量赋值;
  2. 注释: C语言支持单行注释(以//开头)和多行注释(以/*开始,以*/结束);
  3. 数据类型: 基本的数据类型包括整数(int)、浮点数(floatdouble)、字符(char)、枚举enum等;
  4. 数组: 数组是一组相同类型的数据元素的集合。使用以下方法初始化一个五个元素的整数数组:
    int numbers[5] = {1, 2, 3, 4, 5};
    
  5. 封装结构:结构(struct)、联合(union);
  6. 结构化编程和控制结构: C语言包括条件语句(ifelse)、循环语句(forwhiledo-while)等;
  7. 跳转语句:C语言允许使用跳转关键字gotobreakcontinue来实现程序块之间的跳转,这和汇编语言的jmp关键字有一定相似处;
  8. 函数: C语言中的函数是程序的基本模块,可以自定义函数并在程序中调用;
  9. 灵活且靠近底层的内存控制机制:C程序员可以自由选择分配何种内存,以及分配多大的内存,如如下代码所示:
    int *array = (int *)malloc(5 * sizeof(int)); // 分配一个包含五个整数的数组
    free(array); // 释放放使用malloc分配的内存

内存管理

C语言的特色之一是:程序员必须亲自处理内存的分配细节。语言不负责内存边界检查,这是因为在运行时进行内存边界检查会造成性能问题,与UNIX哲学不符。此特性容易导致缓冲区溢出问题。然而,部分编译器(如英特尔编译器)会出于安全性的考量,提供方法以进行运行时内存边界检查。

大多数C语言实现使用栈(Stack)来保存函数返回地址/栈帧基址、完成函数的参数传递和函数局部变量的存储。然而,在部分极特殊的平台上,使用栈并不能获得最大效率。此时的实现由编译器决定。 如果程序需要在运行的过程中动态分配内存,可以利用(Heap)来实现。

基本上C程序的元素存储在内存的时候有3种分配策略:

  • 静态分配

如果一个变量声明为全局变量或者是函数的静态变量,这个变量的存储将使用静态分配方式。静态分配的内存一般会被编译器放在数据段代码段来存储,具体取决于实现。这样做的前提是,在编译时就必须确定变量的大小。 以IA32的x86平台及gcc编译器为例,全局及静态变量放在数据段的低端;全局及静态常量放在代码段的高端。

  • 自动分配

函数的自动局部变量应该随着函数的返回会自动释放(失效),这个要求在一般的体系中都是利用栈(Stack)来满足的。相比于静态分配,这时候,就不必绝对要求这个变量在编译时就必须确定变量的大小,运行时才决定也不迟,但是C89仍然要求在编译时就要确定,而C99放松了这个限制。但无论是C89还是C99,都不允许一个已经分配的自动变量运行时改变大小。

所以说C函数永远不应该返回一个局部变量的地址

要指出的是,自动分配也属于动态分配,甚至可以用alloca函数来像分配堆(Heap)一样进行分配,而且释放是自动的。

  • 动态分配

还有一种更加特殊的情况,变量的大小在运行时有可能改变,或者虽然单个变量大小不变,变量的数目却有很大弹性,不能静态分配或者自动分配,这时候可以使用堆(Heap)来满足要求。ANSI C定义的堆操作函数是malloc、calloc、realloc和free。

使用堆(Heap)内存将带来额外的开销和风险。

—— ——摘选自维基百科

汇总型

C语言知识点汇总_c语言知识点总结-CSDN博客

C语言基础--从零开始初识语言(多图超详解|超万字教程)-CSDN博客

c语言入门这一篇就够了-学习笔记(一万字)_菜鸟教程-CSDN博客

C语言初阶——手把手教零基础/新手入门(万字心得笔记)_c语言入门自学零基础-CSDN博客

C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)_大一c语言基础知识大全-CSDN博客

江苏计算机等级考试二级c语言知识点(手写版)_二级c片-CSDN博客

《数据结构》C语言版(清华严蔚敏考研版) 全书知识梳理 + 练习习题详解(超详细清晰易懂)_严蔚敏《数据结构》(c语言版)典型习题和考研真题详解-CSDN博客

C语言学习思维导图_c语言思维导图-CSDN博客

c语言基础知识 入门必看(保姆级教学)_c语言学习-CSDN博客

B站相关课程

C语言程序设计从入门到进阶【比特鹏哥c语言2024完整版视频教程】(c语言基础入门c语言软件安装C语言指针c语言考研C语言专升本C语言期末计算机二级C语言c语言_哔哩哔哩_bilibili

浙江大学翁恺教你C语言程序设计!C语言基础入门!_哔哩哔哩_bilibili

c语言编程C语言程序设计c语言考研复试C语言基础入门教程专升本c语言视频教程c语言计算机二级考试零基础入门教程c语言考研复试c语言视频教程c语音C语言期末C语言_哔哩哔哩_bilibili

千锋教育新版C语言程序设计基础入门视频,这绝对是C语言教程天花板!_哔哩哔哩_bilibili

【C语言】C语言视频教程_哔哩哔哩_bilibili

C语言编程2024C语言零基础视频教程C语言入门初学者小白C语言考研C语言专升本C语言期末考试不挂科C语言程序设计C语言黑马二级考试突击C语言视频教程谭浩强)_哔哩哔哩_bilibili

【C语言】《带你学C带你飞》_哔哩哔哩_bilibili

C语言相关知识点细分

数据类型

C语言基本数据类型_c语言的基本数据类型-CSDN博客

运算符与表达式

C语言中的运算符(超全超详细)_c语言运算符-CSDN博客

C语言运算符优先级(超详细)-CSDN博客

循环和判断语句

C语言条件判断语句:if、else if、else-CSDN博客

C语言——循环语句(详解)_c语言循环-CSDN博客

函数与函数结构

C语言中的函数(超详细)_c语言函数-CSDN博客

数组

c语言—数组详解(建议收藏)_c语言数组-CSDN博客

指针

C语言——指针_c语言指针-CSDN博客

字符串

C语言字符串详解-CSDN博客

结构体

C语言结构体(struct)常见使用方法_struct在c语言中用法-CSDN博客

文件与文件操作

C语言文件操作(文件读写)_c语言文件读写-CSDN博客

进阶

动态内存

c语言malloc函数的用法和意义-CSDN博客

c语言free函数的作用,c语言中free函数的理解-CSDN博客

链表

建议先弄懂指针,动态创建释放内存等知识点后再来学中级数据结构。比如链表,堆,栈,队列,二叉树,红黑树等。

期末压轴很有可能出链表,这部分要认真看。

C语言链表超详解_链表c语言-CSDN博客

链表相关题目:

经典十二道链表笔试题!_c语言链表经典笔试题-CSDN博客

递归

递归内容已经部分涉及到竞赛内容(虽然比较简单)。但一般不会使用,因为难以调试且容易爆栈,正常的期末考试也不太会考,可以选择性看。

C语言 递归算法及简单递归练习总结_c语言递归-CSDN博客

下面还有一道递归的经典题目:

【C语言】递归详解汉诺塔问题_c语言汉诺塔递归算法详细分析-CSDN博客

BFS和DFS

同上,也属于竞赛内容。要难可以难道逆天,只能多做题找题感。

如何通透理解:BFS和DFS优先搜索算法(23年修订版)_bfs和dfs算法-CSDN博客

简单的动态规划

不是人能学的东西,难爆了。如果要学强烈建议多做题。

教你彻底学会动态规划——入门篇-CSDN博客

【动态规划】01背包问题(通俗易懂,超基础讲解)_动态规划01背包问题-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值