一、概述
最近家里有点事,趁在家的这段时间,复习一下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年排行:
三、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 语言的入口函数的定义。我们了解一下上面这段程序的意思:
- 程序的第一行
#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语言的字符串
- stdio.h 是C语言函数库中的一个头文件,里面定义了一些标准输入输出函数。在main.c的第1行代码中,用
- 下一行
/ *...* /
将会被编译器忽略,这里放置程序的注释内容。它们被称为程序的注释。 - 下一行
int main()
是主函数,程序从这里开始执行。 - 下一行
printf(...)
是 C 中的打印函数,会在屏幕上显示消息 "C 语言入门第一行代码 Hello World!"。 - 下一行 return 0; 终止 main() 函数,并返回值 0。
3、开发和运行C程序的步骤
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底层原理前知识
- 01-探究iOS底层原理|综述
- 02-探究iOS底层原理|编译器LLVM项目【Clang、SwiftC、优化器、LLVM】
- 03-探究iOS底层原理|LLDB
- 04-探究iOS底层原理|ARM64汇编
2. 基于OC语言探索iOS底层原理
- 05-探究iOS底层原理|OC的本质
- 06-探究iOS底层原理|OC对象的本质
- 07-探究iOS底层原理|几种OC对象【实例对象、类对象、元类】、对象的isa指针、superclass、对象的方法调用、Class的底层本质
- 08-探究iOS底层原理|Category底层结构、App启动时Class与Category装载过程、load 和 initialize 执行、关联对象
- 09-探究iOS底层原理|KVO
- 10-探究iOS底层原理|KVC
- 11-探究iOS底层原理|探索Block的本质|【Block的数据类型(本质)与内存布局、变量捕获、Block的种类、内存管理、Block的修饰符、循环引用】
- 12-探究iOS底层原理|Runtime1【isa详解、class的结构、方法缓存cache_t】
- 13-探究iOS底层原理|Runtime2【消息处理(发送、转发)&&动态方法解析、super的本质】
- 14-探究iOS底层原理|Runtime3【Runtime的相关应用】
- 15-探究iOS底层原理|RunLoop【两种RunloopMode、RunLoopMode中的Source0、Source1、Timer、Observer】
- 16-探究iOS底层原理|RunLoop的应用
- 17-探究iOS底层原理|多线程技术的底层原理【GCD源码分析1:主队列、串行队列&&并行队列、全局并发队列】
- 18-探究iOS底层原理|多线程技术【GCD源码分析1:dispatch_get_global_queue与dispatch_(a)sync、单例、线程死锁】
- 19-探究iOS底层原理|多线程技术【GCD源码分析2:栅栏函数dispatch_barrier_(a)sync、信号量dispatch_semaphore】
- 20-探究iOS底层原理|多线程技术【GCD源码分析3:线程调度组dispatch_group、事件源dispatch Source】
- 21-探究iOS底层原理|多线程技术【线程锁:自旋锁、互斥锁、递归锁】
- 22-探究iOS底层原理|多线程技术【原子锁atomic、gcd Timer、NSTimer、CADisplayLink】
- 23-探究iOS底层原理|内存管理【Mach-O文件、Tagged Pointer、对象的内存管理、copy、引用计数、weak指针、autorelease
3. 基于Swift语言探索iOS底层原理
关于函数
、枚举
、可选项
、结构体
、类
、闭包
、属性
、方法
、swift多态原理
、String
、Array
、Dictionary
、引用计数
、MetaData
等Swift基本语法和相关的底层原理文章有如下几篇:
- 01-📝Swift5常用核心语法|了解Swift【Swift简介、Swift的版本、Swift编译原理】
- 02-📝Swift5常用核心语法|基础语法【Playground、常量与变量、常见数据类型、字面量、元组、流程控制、函数、枚举、可选项、guard语句、区间】
- 03-📝Swift5常用核心语法|面向对象【闭包、结构体、类、枚举】
- 04-📝Swift5常用核心语法|面向对象【属性、inout、类型属性、单例模式、方法、下标、继承、初始化】
- 05-📝Swift5常用核心语法|高级语法【可选链、协议、错误处理、泛型、String与Array、高级运算符、扩展、访问控制、内存管理、字面量、模式匹配】
- 06-📝Swift5常用核心语法|编程范式与Swift源码【从OC到Swift、函数式编程、面向协议编程、响应式编程、Swift源码分析】
4. C语言核心语法
- 01-复习C语言核心知识|综述
- 02-复习C语言核心知识|基本语法、数据类型、变量、常量、存储类、基本语句(判断语句、循环语句、go to语句)和运算
- 03-复习C语言核心知识|函数、作用域规则、数组、枚举、字符与字符串、指针
- 04-复习C语言核心知识|结构体、共用体、位域、输入&输出、文件读写
- 05-复习C语言核心知识|预处理、头文件、强制类型转换、错误处理、递归、内存管理
5. C++核心语法
- 01-C++核心语法|C++概述【C++简介、C++起源、可移植性和标准、为什么C++会成功、从一个简单的程序开始认识C++】
- 02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
- 03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
- 04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
- 05-📝C++核心语法|面向对象3【 继承和派生、多态、静态成员、const成员、引用类型成员、VS的内存窗口】
6. Vue全家桶
- 01-📝Vue全家桶核心知识|Vue基础【Vue概述、Vue基本使用、Vue模板语法、基础案例、Vue常用特性、综合案例】
- 02-📝Vue全家桶核心知识|Vue常用特性【表单操作、自定义指令、计算属性、侦听器、过滤器、生命周期、综合案例】
- 03-📝Vue全家桶核心知识|组件化开发【组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互、组件插槽、基于组件的
- 04-📝Vue全家桶核心知识|多线程与网络【前后端交互模式、promise用法、fetch、axios、综合案例】
- 05-📝Vue全家桶核心知识|Vue Router【基本使用、嵌套路由、动态路由匹配、命名路由、编程式导航、基于vue-router的案例】
- 06-📝Vue全家桶核心知识|前端工程化【模块化相关规范、webpack、Vue 单文件组件、Vue 脚手架、Element-UI 的基本使用】
- 07-📝Vue全家桶核心知识|Vuex【Vuex的基本使用、Vuex中的核心特性、vuex案例】
7. 音视频技术核心知识
- 01-📝音视频技术核心知识|了解音频技术【移动通信技术的发展、声音的本质、深入了解音频】
- 02-📝音视频技术核心知识|搭建开发环境【FFmpeg与Qt、Windows开发环境搭建、Mac开发环境搭建、Qt开发基础】
- 03-📝音视频技术核心知识|Qt开发基础【
.pro
文件的配置、Qt控件基础、信号与槽】 - 04-📝音视频技术核心知识|音频录制【命令行、C++编程】
- 05-📝音视频技术核心知识|音频播放【播放PCM、WAV、PCM转WAV、PCM转WAV、播放WAV】
- 06-📝音视频技术核心知识|音频重采样【音频重采样简介、用命令行进行重采样、通过编程重采样】
- 07-📝音视频技术核心知识|AAC编码【AAC编码器解码器、编译FFmpeg、AAC编码实战、AAC解码实战】
- 08-📝音视频技术核心知识|成像技术【重识图片、详解YUV、视频录制、显示BMP图片、显示YUV图片】
- 09-📝音视频技术核心知识|视频编码解码【了解H.264编码、H.264编码、H.264编码解码】
- 10-📝音视频技术核心知识|RTMP服务器搭建【流媒体、服务器环境】
其它底层原理专题
1. 底层原理相关专题
2. iOS相关专题
- 01-iOS底层原理|iOS的各个渲染框架以及iOS图层渲染原理
- 02-iOS底层原理|iOS动画渲染原理
- 03-iOS底层原理|iOS OffScreen Rendering 离屏渲染原理
- 04-iOS底层原理|因CPU、GPU资源消耗导致卡顿的原因和解决方案