01-复习C语言核心知识|综述

959 阅读17分钟

一、概述

最近家里有点事,趁在家的这段时间,复习一下C语言核心知识,后的底层开发、音视频开发、跨平台开发、算法等方向的进一步研究与学习埋下伏笔

二、C 简介

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

  • C语言于1969年至1973年间,为了移植与开发UNIX操作系统,由丹尼斯·里奇肯·汤普逊,以B语言为基础,在贝尔实验室设计、开发出来。

  • 二十世纪八十年代,C语言应用日渐广泛。为了避免各开发厂商用的C语言的语法产生差异,美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言的标准。

  • 与此同时,国际标准化组织也接受该标准为国际标准。因此,ANSI C也同时被称为ISO C。二十世纪八十年代至今的有关程序开发工具,一般都支持符合ANSI C的语法。

  • C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐。

  • 随着UNIX操作系统的成功,C语言也得到了大幅度地推广,至今还是世界上最流行、使用最广泛的高级程序设计语言之一

  • C语言 编译器 )普遍存在于各种不同的 操作系统:

    • Windows
    • MacOS
    • Linux
    • Unix
    • ......
  • C语言的设计影响了众多后来的编程语言,例如:

    • C++
    • Objective-C
    • Java
    • C# 等。现行的许多软件都是由C语言或者其影响和派生的编程语言开发出来的
  • 它可以处理底层的活动。

C语言 2022年~2023年排行: image.png

三、C语言的特点

1.丰富的运算符

  • 计算机的基本功能就是计算,因此一门程序设计语言的计算能力是非常重要的
  • C语言提供了34种运算符,计算类型极其丰富,其中包括了最基本的加减乘除运算

2.丰富的数据类型

C语言之所以生命力如此强大,很大一部分是因为它拥有丰富的数据类型

  • C语言的数据类型有:整型(int)、实型(float)、字符型(char)、数组类型(int [])、指针类型(void *)、结构体类型(struct)、共用体类型(union)等。
  • 众多数据类型中,最强大的是指针
    • 通过指针我们可以直接访问内存地址
    • 指针使用得当的话,不仅可以节省代码量,还可以优化内存管理、提高性能
    • 因此,指针是一个非常重要的概念,必须重视。
    • 如果你说C语言中除了指针,其他都学得挺好的,那你干脆说你没学过C语言。
  • 正因为C语言数据类型丰富,运算能力极强,因此很多数据库都是用C语言编写的,比如DB2、Oracle等。

3.允许直接访问物理地址,对硬件进行操作

由于C语言允许直接访问物理地址可以直接对硬件进行操作,因此它既具有高级语言的功能又具有低级语言的许多功能,能够像汇编语言一样对位(bit)、字节地址进行操作,而这三者是计算机最基本的工作单元

4.高效率的目标代码

对比汇编语言:

  • C语言可读性好
  • 易于调试、修改和移植
  • 代码质量与汇编语言相当。

5.可移植性好

在一个环境上用C语言编写的程序:

  • 不改动稍加改动就可移植到另一个完全不同的环境中运行。

上面说的都算是C语言的优点,不过它肯定是有缺点的:

  • 由于C语言是面向过程的,因此它的数据封装性差安全性低
    • 这就是C语言和其他面向对象语言的区别之一
    • 面向对象语言的特性之一就是数据的封装性
  • 语法限制不严格,对变量的类型约束不严格,对数组下标越界不作检查

 

四、C语言能做什么?

  • 由于C语言具有强大的数据处理能力,而且允许直接访问物理地址,直接对硬件操作,因此它适于:
    • 编写系统软件
    • 图形处理
    • 单片机程序
    • 嵌入式系统开发甚至是用于科研
  • 很多操作系统的底层都是用C语言写的,比如Android
  • iOS开发中的核心语言是Objective-C(简称OC),OC是在C语言的基础上加了一层面向对象语法

 

五、C语言的版本问题

从UNIX操作系统的成功后,C语言得到了广泛地应用,从大型主机到小型微机,都有C语言活跃的身影,也衍生了很多个版本的C语言。
长期以往,C语言将可能成为一门有多个变种、松散的语言。一门正式的语言,肯定要有个标准才行,不然就乱套了。
为了改变这种局面,1983年美国国家标准局(American National Standards Institute,简称ANSI)成立了一个委员会,开始制定C语言标准的工作。1989年C语言标准被批准,这个版本的C语言标准通常被称为ANSI C

 

六、C语言语法预览

1.学习C语言的编程环境

  • 如果你是在Windows环境下,可以下载这个简单的C语言学习工具:C/C++程序设计学习与实验系统 或者 下载微软的Visual C++
  • 我使用的是Mac电脑,因此我用的是开发工具是 Xcode,大家可以根据自己的喜好,选择其它开发环境,如Clion等

七、第一段 C语言程序

1、HelloWorld

不知道大家在学习一门新的开发语言敲的第一行代码是什么?应该百分之 90 % 以上都是打印 ”HelloWorld“ 吧,我们就以打印 ”HelloWorld“ 为例来正式进入 C 语言的学习吧。

我们先来看一下最简单的一个 C 程序,先来打印一个 “HelloWorld”。代码如下:

//
//  main.c
//  01-函数入口
//
//  Created by VanZhang on 2022/5/16.
//

#include <stdio.h>
/**
 * C 语言入口程序 main函数
 *
*/
int main(int argc, const char * argv[]) {//主函数,程序从这里开始执行
    // insert code here...
    printf("Hello, World!\n");
    return 0;
} 

2、程序结构分析

很多语言的程序入口都是main函数,这个基本模仿自 C 语言的入口函数的定义。我们了解一下上面这段程序的意思:

  1. 程序的第一行 #include <stdio.h> 是预处理器指令,告诉 C 编译器在实际编译之前要包含 stdio.h 文件。
    • #include 是C语言的预处理指令之一
    • 所谓预处理,就是在编译之前做的处理,预处理指令一般以 # 开头
    • #include 指令后面会跟着一个文件名,预处理器发现 #include 指令后,就会根据文件名去查找文件,并把这个文件的内容包含到当前文件中。
      • 被包含文件中的文本将替换源文件中的 #include 指令,就像你把被包含文件中的全部内容拷贝到这个 #include 指令所在的位置一样
    • 如果被包含的文件拓展名为.h,我们称之为"头文件"(Header File),头文件可以用来声明函数("函数"就是面向对象中的"方法"),要想使用这些函数,就必须先用 #include 指令包含函数所在的头文件
    • #include 指令不仅仅限于.h头文件,可以包含任何编译器能识别的C/C++代码文件,包括.c,.hpp,.cpp等,甚至.txt,.abc等等都可以
    • 如果是系统自带的文件,最好用<>;如果是开发人员自己创建的文件,最好用""
    • .stdio.h
      • stdio.h 是C语言函数库中的一个头文件,里面定义了一些标准输入输出函数。在main.c的第1行代码中,用#include指令包含了stdio.h文件。
      • 这里之所以包含 stdio.h 文件,是因为在第7行中用到了在 stdio.h 内部声明的printf函数,这个函数可以向标准输出设备(比如显示器屏幕)输出数据,屏幕上输出的文字就是第7行代码printf("Hello, World!\n");造成的,双引号""内的文本为C语言的字符串
  2. 下一行 / *...* / 将会被编译器忽略,这里放置程序的注释内容。它们被称为程序的注释。
  3. 下一行int main()是主函数,程序从这里开始执行。
  4. 下一行printf(...)是 C 中的打印函数,会在屏幕上显示消息 "C 语言入门第一行代码 Hello World!"。
  5. 下一行 return 0; 终止 main() 函数,并返回值 0。

3、开发和运行C程序的步骤

image.png

1.编写程序

C语言源文件的扩展名为".c",源文件以ASCII码形式存储,不能直接被计算机执行,因为计算机只能识别二进制指令,也就是0和1

2.编译(VC环境下)

  • 把C的源程序翻译成计算机可以识别的二进制形式的目标代码文件,这个过程称为编译,由C的编译器完成
  • 在编译的同时,还对源程序的语法等进行检查。若出现语法错误,则编译失败。如果编译成功则生成目标文件,目标文件名跟源程序文件名一样,扩展名为".obj"。比如,HelloWorld.c编译后生成目标文件HelloWorld.obj
  • 每个源文件是单独进行编译的,假如一个项目中有多个.c源文件,编译成功会生成多个对应的.obj目标。一般情况下,目标文件之间是有关联的,比如 a.obj 可能会调用 b.obj 中定义的一个函数,因此它们都不能够单独被计算机执行,而且目标文件中并不包含程序运行所需要的库函数等

3.链接(VC环境下)

  • 将所有有关联的obj目标文件,以及系统提供的C库函数等组合在一起生成可执行文件的过程,称为"链接"
  • 链接生成的可执行文件的文件名跟源程序文件同名,扩展名为".exe",计算机可以直接执行

4.运行

  • 如果是在Windows环境下,直接双击".exe"文件即可运行C语言程序
  • 由于我们的第一个C程序,是在Mac OS X系统环境下用Xcode创建的命令行项目,Mac OS X系统是基于UNIX系统的,因此生成的可执行文件的这样的:

专题系列文章

1. iOS底层原理前知识

2. 基于OC语言探索iOS底层原理

3. 基于Swift语言探索iOS底层原理

关于函数枚举可选项结构体闭包属性方法swift多态原理StringArrayDictionary引用计数MetaData等Swift基本语法和相关的底层原理文章有如下几篇:

4. C语言核心语法

5. C++核心语法

6. Vue全家桶

7. 音视频技术核心知识

其它底层原理专题

1. 底层原理相关专题

2. iOS相关专题

3. webApp相关专题

4. 跨平台开发方案相关专题

5. 阶段性总结:Native、WebApp、跨平台开发三种方案性能比较

6. Android、HarmonyOS页面渲染专题

7. 小程序页面渲染专题