还剩58页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
深度掌握语言C欢来语课课迎到深度掌握C言的程!本程旨在帮助你全面、深入地理解和掌握语编级应过课习将编写C言的核心概念、程技巧和高用通本程的学,你能够维语为来软开编坚高效、可靠、可护的C言程序,未的件发和系统程打下实的础基语编语应编开C言是一门强大而灵活的程言,广泛用于系统程、嵌入式发、游戏开领语仅编还让发等域掌握C言,不能够提升你的程能力,能你更深入地计层理解算机底原理课程概述课程目标学习路径预期收获课标让语们习径为阶础课将练编写语本程的主要目是你全面掌握C言我的学路分三个段基知完成本程后,你能够熟C编过论习识进阶级应础识语的核心概念和程技巧通理学、技巧和高用在基知言程序、理解C言的核心概念、掌握C践练习将练语阶们将习语语数语编语问和实,你能够熟运用C言解段,我学C言的基本法和言的程技巧、运用C言解决实际问题软开进阶阶们将题软开决实际,并具备一定的件发能据类型在技巧段,我深入、具备一定的件发能力此外,们将讨语语数讨针内还将对计层力我深入探C言的法、据探指、存管理和文件操作在高你算机底原理有更深入的理结数针内级应阶们将习线编为来习坚类型、控制构、函、指、存管用段,我学多程程、解,未的学和工作打下实的基内络编开础理等重要容网程和嵌入式系统发语言简介C起源与发展应用领域12语纪语应领C言起源于20世70年代初,由C言广泛用于各种域,包括验数库美国贝尔实室的Dennis Ritchie操作系统、嵌入式系统、据、开语继编译络协议戏开发它是B言的后者,最初器、网、游发等开语用于Unix操作系统的发C言Unix、Linux、Windows等操作计标语开的设目是提供一种高效、灵活系统都是用C言或其变种发的编语访许数库、可移植的程言,能够直接多流行的据系统,如问计算机硬件MySQL和PostgreSQL,也是用C语编写言的3为什么选择C语言选择语层C言的原因有很多高效性、可移植性、灵活性、强大的底控制能力库语码访问计、丰富的支持C言能够生成高效的机器代,可以直接算机硬件进层编语语简习语,方便行底程C言的法洁明了,易于学和掌握此外,C言庞开区开库进软开拥有大的发者社和丰富的源,可以方便地行件发语言的特点C高效性可移植性语编语语C言是一种高效的程言,能够C言具有良好的可移植性,可以在码计标生成高效的机器代它的设目不同的操作系统和硬件平台上运行访问计这为语标编是提供一种能够直接算机硬件是因C言是一种准化的程编语计语编译语的程言,因此可以充分利用算言,不同的器都遵循相同的资规则机的源,提高程序的运行效率C法只要在不同的平台上安装相语编译对码进应编译将语言的器能够代行优化,的器,就可以C言程序移该这软减少不必要的指令,提高程序的性能植到平台上运行大大提高了开维件的发效率和可护性灵活性语进层编访问计C言具有很高的灵活性,可以行底程,直接算机硬件它提供了指针进内语还编、位操作等特性,方便行存管理和硬件控制C言支持模块化程,可将为码维这语为以程序分解多个模块,提高代的可重用性和可护性使得C言成系编开选语统程和嵌入式发的首言开发环境搭建编译器选择IDE安装配置步骤选择语编译开环语开环进合适的C言器是搭建集成发境(IDE)可以提高C配置C言发境需要行以开环语语开骤编译发境的第一步常用的C言程序的发效率常用的C下步安装器、安装IDE编译语编译径创项言器包括GCC、Clang、言IDE包括Code::Blocks、、配置器路、建目、编写码编译码Visual C++等GCC是GNU Eclipse、Visual Studio等代、代、运行程序缩写开编译时选择Compiler Collection的,Code::Blocks是一款源的跨在安装器,需要合开编译应编译径是一款源的器,广泛用平台IDE,支持多种器适的版本和安装路在安装时选择于Linux和Unix平台Clang是Eclipse是一款流行的Java IDEIDE,需要合适的插件和项过来编译径时LLVM目的一部分,也是一款,可以通安装CDT插件支持配置在配置器路,需开编译语开将编译执径源的器,具有良好的性能C言发Visual Studio是一要器的可行文件路添扩软环创项和可展性Visual C++是微款强大的IDE,适用于Windows加到系统境变量中在建编译时选择项的C++器,适用于Windows平台目,需要合适的目类型编写码时平台和模板在代,需要遵语语规则编译循C言的法在代码时编译将码,需要使用器源代转换为执可行文件在运行程序时载执,需要使用操作系统加和执行可行文件第一个程序C Hello World代码结构1简单语数语一个的C言程序通常包含以下几个部分头文件、主函、句头文件标数包含了程序所需的声明和定义,例如stdio.h包含了准输入输出函的声明数数开执语执单主函是程序的入口点,程序从主函始行句是程序的基本行元,用于完成特定的操作编译过程2语编译过骤预编译汇编链预C言程序的程通常包含以下几个步处理、、、接阶码预编译阶将预处理段处理源代中的处理指令,例如#include和#define段码转换为汇编码汇编阶将汇编码转换为码链阶处理后的源代代段代机器代接将标链执段多个目文件接成一个可行文件运行结果3语应结运行C言程序后,会在控制台输出相的果例如,HelloWorld程序会在结执终现员调控制台输出Hello,World!运行果是程序行的最表,也是程序试测试过观结断预和程序的重要依据通察运行果,可以判程序是否按照期的方执错误式行,并找出程序中的基本数据类型整型数整型用于表示整,包括int、short、long、long long等不同的整型类型占用内数围节不同的存空间,表示的整范也不同int类型通常占用4个字,可以表示-数节2147483648到2147483647之间的整short类型通常占用2个字,long类节节型通常占用4或8个字,long long类型通常占用8个字浮点型数浮点型用于表示实,包括float、double、long double等不同的浮点型类型内数节占用不同的存空间,表示的实精度也不同float类型通常占用4个字,提数节数供6-7位有效字double类型通常占用8个字,提供15-16位有效字long节double类型通常占用10或12个字,提供更高的精度字符型节字符型用于表示字符,通常用char类型表示char类型占用1个字,可以表示储单256个不同的字符字符型变量可以存个字符,例如A、B、c等字符型储数码码变量也可以存整,表示字符的ASCII值例如,字符A的ASCII值是65,码字符a的ASCII值是97变量与常量常量定义常量是程序中值不能被修改的量常量可以用两关键预种方式定义使用const字或使用#define关键处理指令使用const字定义的常量具有类型,例如const intMAX_AGE=100;使用变量声明与初始化2预没#define处理指令定义的常量有类型,例如#define PI
3.14159常量在程序运行期间值不储数储单尝试编译报变量是程序中用于存据的命名存元变能被修改,如果修改常量的值,器会称1错量声明用于指定变量的类型和名,例如int为age;声明了一个名age的整型变量变量初始给赋将命名规则化用于变量初值,例如int age=20;age为须变量初始化20变量必先声明后使用,且必规则称须变量和常量的命名需要遵循一定的名只初始化后才能使用数线须3能包含字母、字和下划,且必以字母或下线开称语关键划头名不能与C言的字冲突,例如称应该int、float、if、for等名具有描述性,能议够清晰地表达变量或常量的含义通常建变量写写单名使用小字母,常量名使用大字母,多个词线之间用下划分隔运算符逻辑运算符1对逻辑进用于表达式行运算,包括与、或||、非!关系运算符2较关用于比两个表达式的大小系,包括等于==、不等于!=、大于、小于、大于等于=、小于等于=算术运算符3进术用于行算运算,包括加+、减-、乘*、除/、取余%表达式与语句复合语句1语组来由多条句成,用花括号括起语句类型2语语语语包括表达式句、控制句、复合句、空句表达式求值3级结进计按照运算符的优先和合性行算规则语编写语础级结细语理解表达式的求值和句的类型是C言程序的基表达式求值涉及到运算符的优先和合性,需要仔分析句类型语语语语语语语组来包括表达式句、控制句、复合句和空句,每种句都有不同的作用复合句由多条句成,用花括号括起,可以形成码语执简码逻辑一个代块空句不行任何操作,通常用于占位或化代控制流程if-else语执码语断为为则执码则执码语断if-else句用于根据条件行不同的代块if句判条件是否真,如果真行if代块,否行else代块if-else句可以嵌套使用,形成多重条件判在使用语时顺现逻辑错误断错误码错误if-else句,需要注意条件的序,避免出常见的陷阱包括条件判、代块缺失、else匹配等控制流程switch语法结构break语句的重要性与if-else的比较语选择执语语语语断switch句用于根据表达式的值行不同break句在switch句中非常重要,用于跳switch句和if-else句都可以用于条件判码语语没语们应场语的代块switch句包含一个表达式和多个出switch句如果有break句,程序会,但它的用景不同switch句适用于标签标签进继续执标签对应码为数case表达式的值与case的值行比行下一个case的代块,直到表达式的值离散的情况,例如整、字符等较则执该标签对应码语语结这语为连续围,如果匹配行case的代块遇到break句或switch句束种情况if-else句适用于表达式的值或范标签语结称为导逻辑错误数区语每个case通常以break句尾,用于被case穿透,可能会致因此的情况,例如浮点、间等switch句的语标签语结执语读跳出switch句如果表达式的值与所有case,每个case通常以break句尾,以避行效率通常比if-else句高,但可性可能标签则执标签对应选择语还语的值都不匹配,行default的免case穿透稍差在使用switch句是if-else句码时进权代块,需要根据具体情况行衡循环结构循环for环环结执码环语环语语for循是一种常用的循构,用于重复行一段代for循包含三个部分初始化句、循条件、更新句初始化句在环开执环环环开断为则执环则环语循始前行一次,用于初始化循变量循条件在每次循始前判,如果真行循体,否跳出循更新句在环结执环环环数历数组计阶每次循束后行,用于更新循变量for循适用于已知循次的情况,例如遍、算乘等循环结构和while do-while语法比较使用场景性能考虑环环环环数环环while循和do-while循都是用于重while循适用于循次未知的情况,while循和do-while循的性能差异执码环结们读络数计选择复行一段代的循构,但它的例如取文件、接收网据等do-通常很小,可以忽略不在使用语执环环执环环还环时法和行方式有所不同while循先while循适用于需要至少行一次循while循是do-while循,主要断环为为则执验证单选虑码读维判循条件是否真,如果真体的情况,例如用户输入、菜考代的可性和可护性如果循环则环择选择环还环较杂环较行循体,否跳出循do-while循等在使用while循是do-条件比复,或者循体比长,环执环断环环时进权则释来码读先行循体,再判循条件是否while循,需要根据具体情况行可以使用注提高代的可性为为则继续环则证环执还环环真,如果真循,否跳出衡如果需要保循体至少行一次此外,需要注意避免死循,即循环环执则环则远为导结循因此,do-while循至少会行,使用do-while循;否,使用条件永真,致程序无法束环环环一次循体,而while循可能一次也不while循执行跳转语句break continue语环语语过当环break句用于跳出循或switch continue句用于跳前循的剩当执语时码进环当执句程序行到break句,会余代,入下一次循程序终当环语执语时终当立即止前循或switch句的行到continue句,会立即止转环语环执转环开行,跳到循或switch句后面的前循的行,跳到循的始处码语满继续断环为代break句通常用于在足特,判循条件是否真时结环语语满定条件提前束循或switch句continue句通常用于在足特定条时过环码件跳循体的部分代goto(慎用)语转标签语现goto句用于无条件跳到程序中的指定处goto句可以实灵活的控制导码难维语应该尽流程,但也容易致代以理解和护因此,goto句慎用,量使用结语环语构化的控制流程,例如if-else句、循句等在某些特殊情况下,例如跳环错误语出多重循、处理等,可以使用goto句函数基础函数定义数数称数数数函定义用于指定函的名、参和函体函定义包含以下几个部分返回类数数数数型、函名、参列表、函体返回类型指定函返回值的类型,例如int、float数数标识调数数数、void等函名是函的唯一符,用于在程序中用函参列表指定函数称数传数数数现码接收的参类型和名,用于向函递据函体包含函的具体实代,用于完成特定的操作函数声明数编译数调数时进检数函声明用于提前告知器函的存在,以便在用函行类型查函声数数数数明包含以下几个部分返回类型、函名、参列表函声明不需要包含函体,数数只需要指定函的接口即可函声明通常放在头文件中,以便在多个源文件中共享函数调用数调执数码获数数调函用用于行函体中的代,并取函的返回值函用包含以下几个部数数数调数数数数数分函名、参列表函用需要指定函名和参列表,参列表中的参须数数数调暂当数执转量和类型必与函定义中的参列表匹配函用会停前函的行,跳调数数执执毕调数获数到被用函的函体中行,行完后再返回到用函,并取函的返回值函数参数引用传递传将传给引用递是指实参的地址递形参在函数内别对部,形参是实参的名,形参的修改会传直接影响实参的值引用递适用于需要修改换传值传递2实参值的情况,例如交、排序等引用递的优点是可以直接修改实参的值,提高程序的产谨传将传给效率,缺点是容易生副作用,需要慎使用值递是指实参的值复制一份递形参数内对1在函部,形参是实参的副本,形参的修传改不会影响实参的值值递适用于不需要修数组作为参数计较传改实参值的情况,例如算、比等值递简单语数组为数传时传的优点是易懂,缺点是需要复制实参的值在C言中,作参递,实际上数组数内过,可能会降低程序的性能递的是的首地址在函部,可以通3针数组数组数组为指操作元素,修改的值作数传时数组参递,不需要指定的大小,只需要数组指定的类型即可例如,voidprintArrayint arr[],int size;声明了一个接数组为数数收整型作参的函函数返回值多值返回技巧1结针来现可以使用构体或指实多值返回语句return2将数结给调用于函的果返回用者返回类型3数数结针指定函返回值的类型,可以是基本据类型、构体、指等数数执结过语给调数数结针数函返回值是函行的果,可以通return句返回用者函返回值可以是基本据类型、构体、指等如果函不则将为语终数执将结给调数没语需要返回值,可以返回类型指定voidreturn句用于止函的行,并果返回用者如果函有return句,则认结针来现将结过针默返回0可以使用构体或指实多值返回,即多个值封装到一个构体中,或通指修改实参的值作用域与生命周期访问围数码数码执作用域是指变量可以被的范生命周期是指变量存在的duration.局部变量的作用域是定义它的函或代块,生命周期是函或代块的行期间全局变量的作用域是整个文执静态数码执编写语础件,生命周期是程序的行期间变量的作用域是定义它的函或代块,但生命周期是程序的行期间理解变量的作用域和生命周期是C言程序的重要基,可以避免变内问题量命名冲突、存泄漏等递归函数递归原理经典案例阶乘计算递归与迭代的比较归数调归阶计归数阶归问题递是指函直接或间接地用自身递函乘算是递函的经典案例乘的定义递和迭代都可以用于解决重复性的,但数满们现归需要足两个条件有一个或多个基本情况是n!=n*n-1*n-2*...*1可以使用递它的实方式和性能有所不同递使用函结归归数来计阶时数调来现环结来(base case),用于束递;有一个或多函算乘,基本情况是n=0,返回用自身实重复,迭代使用循构归将问题归时现归简个递情况(recursive case),用于1;递情况是n0,返回n*factorialn-实重复递的优点是洁明了,易于理解为问题调归归数码导栈较分解更小的子,并用自身解决递1递函factorial的代如下int,缺点是容易致溢出,性能低迭代的简导较导栈的优点是洁明了,易于理解,缺点是容易factorialint n{if n==0{return1;}else优点是性能高,不容易致溢出,缺点是栈谨码较杂难选择致溢出,需要慎使用{return n*factorialn-1;}}代可能比复,以理解在使用递归还时进权是迭代,需要根据具体情况行衡数组基础一维数组多维数组数组初始化维数组维数组维数组维数组数组数组时给数一是指只有一个度的,用多是指具有多个度的,用初始化是指在声明的同储组数维数组储维数维数组组赋数组于存一相同类型的据一于存多据多的声明方式元素初值初始化可以用两种数组数组数组维维赋的声明方式是类型名[大小];是类型名[度1大小][度2大小方式逐个元素值或使用初始化列表赋标给数例如,int arr
[10];声明了一个包含10个]...;例如,int arr
[3]
[4];声明了一个包含逐个元素值是指使用下逐个数数组维数组过维数组维数组组赋整的一的元素可以通3行4列的二多的元素可元素值,例如,arr
[0]=1;arr
[1]=标访问标开数组过标访问标对应下,下从0始,到大小减以通多个下,每个下一2;...使用初始化列表是指使用花括号结数组维数组将数组来1束例如,arr
[0]表示的第一个个度例如,arr
[0]
[0]表示的第元素的值括起,例如,int数组数组元素,arr
[9]表示的最后一个元素一个元素,arr
[2]
[3]表示的最后一arr
[5]={1,2,3,4,5};如果初始化列数数组则个元素表中的元素量小于大小,剩余数组为的元素会被自动初始化0字符串处理字符数组字符串函数语数组语数在C言中,字符串实际上是字符字C言提供了一系列字符串函,用于处理数组结数符是以空字符\0尾的字符序列字符串常用的字符串函包括strlen数组来储计将可以使用字符存和操作字符串用于算字符串的长度,strcpy用于数组数组字符的声明方式是char str[大一个字符串复制到另一个字符串,strcat将连小];例如,char str
[20];声明了一个可以用于一个字符串接到另一个字符串的储数组较存19个字符的字符串字符的最后末尾,strcmp用于比两个字符串的大须一个元素必是空字符,用于表示字符串小,strstr用于在一个字符串中查找另一结这数的束个字符串些字符串函都定义在该string.h头文件中,需要包含头文件才能使用常见字符串操作赋连较常见的字符串操作包括字符串值、字符串复制、字符串接、字符串比、字符串查找换数来现这、字符串分割、字符串替等可以使用字符串函实些字符串操作例如,可以使数来现数来现连用strcpy函实字符串复制,使用strcat函实字符串接,使用strcmp函数来现较数来现实字符串比,使用strstr函实字符串查找指针基础指针概念针储内针数指是一种特殊的变量,用于存存地址指可以指向任何类型的据,数数数组结针访问内例如整、浮点、字符、、构体等指提供了一种间接存的内数方式,可以灵活地操作存中的据指针声明与初始化针针数针指的声明方式是类型*指名;例如,int*p;声明了一个指向整的指针给针赋将针内指的初始化是指指初值,通常是指指向一个已知的存地址可来获内以使用取地址运算符取变量的存地址,例如,int a=10;int*p=将针内a;指p指向变量a的存地址指针运算针进针针针较针指可以行一些特殊的运算,例如指加法、指减法、指比等指针针针较断针加法和指减法用于移动指的位置,指比用于判指是否指向同一个内针针针进时存地址指运算需要注意指的类型,不同类型的指行运算,移动节数将针节为的字不同例如,int*p;p++;指p向后移动4个字,因int类型占节用4个字指针与数组指针数组针数组数组针针数组指是指的元素是指类型指储组数针可以用于存一指向不同类型据的指指针数组数组数组的声明方式是类型*名[大小];数数组名作为指针2例如,int*arr
[5];声明了一个包含5个指向整针数组针数组储组的指的指可以用于存一字符语数组为针数在C言中,名可以作指使用,指向串,例如,char*str
[3]={hello,world,组的第一个元素例如,int arr
[10];int*p=1c};将针数组arr;指p指向arr的第一个元素可以使针来访问数组数组多维数组与指针用指元素,例如,*p表示的数组第一个元素,*p+1表示的第二个元素,以维数组针来访问维数组数数组为针时进赋多也可以使用指多的此类推名作指使用,不能行值组数组针该针为数组针名是指向的第一个元素的指,但指操作,因名是常量指3数组针的类型是指向的指例如,int arr
[3]
[4];将针数组int*p
[4]=arr;指p指向arr的第一个数数组针元素,p的类型是指向包含4个整的的指针来访问维数组可以使用指多元素,例如,数组**p+i+j表示的第i行第j列的元素动态内存分配free1释态内内放动分配的存,防止存泄漏realloc2态内重新分配动分配的存大小calloc3内为分配指定大小的存,并初始化0malloc4内进分配指定大小的存,但不行初始化态内时态内语数来现态内动存分配是指在程序运行根据需要动地分配存空间C言提供了malloc、calloc、realloc和free等函实动存分配malloc函数内进数内为数态内用于分配指定大小的存,但不行初始化calloc函用于分配指定大小的存,并初始化0realloc函用于重新分配动分配的存大小数释态内内态内时内问题内没释导内资费free函用于放动分配的存,防止存泄漏在使用动存分配,需要注意存泄漏,即分配的存有被放,致存源浪可以来检测内使用Valgrind等工具存泄漏结构体int charfloat char*结数将数组结结员员构体是一种复合据类型,用于多个不同类型的据合成一个整体构体的定义方式是struct构体名{成类型成名;...};例如,struct Person{char name
[20];int age;为结员结来储结数为结float salary;};定义了一个名Person的构体,包含name、age和salary三个成可以使用构体变量存构体类型的据,例如,struct Personp;声明了一个名p的Person构来访问结员给员赋为结结员结体变量可以使用点运算符.构体成,例如,p.age=20;p的age成值20构体可以嵌套使用,即一个构体的成可以是另一个构体类型联合体联合体定义联合体应用与结构体的区别数内节内当储结区别结员联合体是一种特殊的据类型,用于在相同的存联合体通常用于省存空间,例如,需要存联合体和构体的在于,构体的所有成占储数数这数阶内员空间存不同的据类型联合体的定义方式是不同类型的据,但些据在程序的不同段使用不同的存空间,而联合体的所有成共享同一员员时来内还内结员union联合体名{成类型成名;...};例如,用,可以使用联合体共享存空间联合体块存空间构体的大小等于所有成的大小之转换将数储员结union Data{int i;float f;char str
[20];};定义了可以用于类型,例如,可以一个整存到和,而联合体的大小等于最大的成的大小构为员将释为数将数组一个名Data的联合体,包含i、f和str三个成联合体中,然后其解浮点但是,在使用体用于多个不同类型的据合成一个整体,而员内时时储员内储数联合体的所有成共享同一块存空间,因此联联合体需要注意,同一刻只能存一个成的联合体用于在相同的存空间存不同的据类型员时储员则导数选择结还时合体的大小等于最大的成的大小可以使用联合值,如果同存多个成的值,会致据覆在使用构体是联合体,需要根据具体来储数进权体变量存联合体类型的据,例如,union盖情况行衡为Data d;声明了一个名d的Data联合体变量可来访问员以使用点运算符.联合体成,例如,d.i=给员赋为10;d的i成值10枚举类型枚举定义枚举应用枚举的内部表示举数举码读语举内数枚类型是一种用户自定义的据类型枚类型通常用于提高代的可性和在C言中,枚类型的部表示是整组数举维举来举数,用于定义一命名的整常量枚可护性例如,可以使用枚类型类型枚常量实际上是整常量,默举状态选项标举认开类型的定义方式是enum枚类型名{表示、、志等使用枚类从0始,依次递增可以使用强制类举举转换将举转换为数枚常量1,枚常量2,...};例如,型可以避免使用magic numbers,提高型枚常量整类型,例码读enum Color{RED,GREEN,BLUE};定代的可性例如,可以使用enum如,int redValue=intRED;可以使为举关键给举别义了一个名Color的枚类型,包含Status{SUCCESS,FAILURE,用typedef字枚类型定义名,举来状态RED、GREEN和BLUE三个枚常量PENDING};表示程序的使用枚例如,typedef enum Color Color;举认开举进检举数枚常量默从0始,依次递增可以类型可以方便地行类型查,防止枚类型的大小等于整类型的大小,举来储举数现逻辑错误节使用枚变量存枚类型的据,出例如,可以使用switch通常是4个字为语来举例如,enumColorc;声明了一个名c句处理枚类型的值举将举赋的Color枚变量可以枚常量值给举给赋为枚变量,例如,c=RED;c值RED文件操作文件打开与关闭语数开数关闭数在C言中,可以使用fopen函打文件,使用fclose函文件fopen函的原型是开FILE*fopenconst char*filename,const char*mode;filename是文件名,mode是打模式读写数,例如r表示只,w表示只,a表示追加fclose函的原型是int fcloseFILE针开时关闭释资损*fp;fp是指向文件的指打文件后,需要及文件,放文件源,防止文件坏文件读写语数读数写数在C言中,可以使用fread函取文件,使用fwrite函入文件fread函的原型是读数缓区size_t freadvoid*ptr,size_t size,size_t count,FILE*fp;ptr是取据的冲,size是每个数读数数针数据的大小,count是取据的个,fp是指向文件的指fwrite函的原型是size_t写数缓区fwriteconst void*ptr,size_t size,size_t count,FILE*fp;ptr是入据的冲,size是每数写数数针进读写时个据的大小,count是入据的个,fp是指向文件的指在行文件操作,需要注意开现读写错误文件的打模式,防止出文件指针操作语数针数获针在C言中,可以使用fseek函移动文件指,使用ftell函取文件指的位置,使用数将针开数rewind函文件指移动到文件头fseek函的原型是int fseekFILE*fp,long针offset,int whence;fp是指向文件的指,offset是偏移量,whence是起始位置,例如开当结数SEEK_SET表示文件头,SEEK_CUR表示前位置,SEEK_END表示文件尾ftell函的原针数型是long ftellFILE*fp;fp是指向文件的指rewind函的原型是void rewindFILE针针来数进访问*fp;fp是指向文件的指可以使用文件指操作定位文件中的据,方便行随机预处理器指令条件编译指令1选择编译码#ifdef,#ifndef,#else,#endif等,用于根据条件不同的代块#define2换码定义宏,用于替代中的文本#include3将内包含头文件,头文件中的容插入到源文件中预编译预预编译处理器指令是在之前由处理器处理的指令常用的处理器指令包括#include、#define和条件指令#include指令用将内换码编译于包含头文件,头文件中的容插入到源文件中#define指令用于定义宏,用于替代中的文本条件指令用于根据条件选择编译码预简码码读维不同的代块,例如#ifdef、#ifndef、#else和#endif等处理器指令可以用于化代、提高代的可性和可护性现编译、实跨平台等宏定义宏与函数的比较1预阶进换数时调宏在处理段行替,函在运行用带参数的宏2数现数可以接受参,实类似函的功能宏定义语法3换#define宏名替文本,用于定义宏预将标识为简码码读维宏定义是一种处理器指令,用于一个符定义一个字符串宏定义可以用于化代、提高代的可性和可护性宏定语换标识换换带数数义的法是#define宏名替文本宏名是符,用于表示宏,替文本是字符串,用于替宏名参的宏可以接受参,现数预阶进换数时调进检错选实类似函的功能宏在处理段行替,函在运行用宏的优点是效率高,缺点是不行类型查,容易出在择还数时进权使用宏是函,需要根据具体情况行衡位操作对进进语进位操作是指二制位行操作C言提供了一系列位运算符,用于行位操作常用的位运算符包括按位与、按位或|、按位异或^、按位取反~、左移和右移按位与用将数对应进结为当仅当数对应为将数对应进结为当仅当数对应为于两个操作的位行与运算,果1且两个操作的位都1按位或|用于两个操作的位行或运算,果1且两个操作的位至少有一个1按将数对应进结为当仅当数对应将数进数将数进位异或^用于两个操作的位行异或运算,果1且两个操作的位不同左移用于操作的二制位向左移动指定的位,右移用于操作的二制位向右数进层编码现移动指定的位位操作可以用于行底程、优化代、实特定算法等错误处理errno变量perror函数assert宏储调数将储错误断检errno是全局变量,用于存最近一次系统perror函用于errno变量中存的assert宏用于在程序中插入言,用于查错误码当调错误时将错码转换为标错误状态用的系统用发生,会字符串,并输出到准输出程序的运行assert宏的原型是void误码储过检数存到errno变量中可以通查errno perror函的原型是void perrorconstassertint expression;expression是表达式来断调错误断状态变量的值判系统用是否成功errno变char*s;s是字符串,用于描述perror,用于判程序的运行如果expression数将错误标错误为则错误终量的定义在errno.h头文件中函会s字符串和信息输出到准输的值假,assert宏会输出信息并进错误调试出,方便行止程序运行assert宏的定义在assert.h头调试阶文件中assert宏通常用于段,可以在发布版本中禁用,以提高程序的性能命令行参数和解析命令行参数函数argc argvgetopt数数环结来历数组获数数argc和argv是main函的参,用于接可以使用循构遍argv,getopt函是用于解析命令行参的数数数数来数收命令行参argc是整,表示命令取命令行参可以使用字符串函函,定义在unistd.h头文件中数数针数组储数数带选项行参的个argv是指,存解析命令行参,例如strstr、getopt函可以处理有的命令数语来数命令行参的字符串argv
[0]是程序名strcmp等可以使用switch句根行参,例如-a、-b、-c等getopt数数执数选项数进,argv
[1]、argv
[2]...是命令行参据命令行参行不同的操作在解析函可以自动处理的参,方便来获数数时错误数数可以使用argc和argv取命令行参命令行参,需要注意处理,例行命令行参解析使用getopt函数执数数数错误简数码,并根据命令行参行不同的操作如参个不足、参类型等可以化命令行参解析的代,提高码读维代的可性和可护性多文件编程头文件数结举头文件用于声明函、变量、构体、联合体、枚类型、宏定义等头文件的扩现码应该展名通常是.h头文件可以被多个源文件包含,实代的共享头文件应该现细节包含接口信息,不包含实源文件现数结举扩源文件用于实函、变量、构体、联合体、枚类型等源文件的展名通应该现细节应该常是.c源文件包含实,不包含接口信息关键字extern关键数关键extern字用于声明在其他文件中定义的变量或函extern字可以用于现数关键时数实变量和函的共享在使用extern字,需要注意变量和函的类型必须匹配模块化编程接口与实现分离2将现开码模块的接口和实分,提高代的维可重用性和可护性信息隐藏1将内现细节隐来模块的部实藏起,只暴给露接口外部使用模块设计原则内码3高聚、低耦合,提高代的可重用性维和可护性链表单向链表双向链表循环链表单链线数结节链线数结节环链线数结节向表是一种性据构,由一系列双向表是一种性据构,由一系列循表是一种性据构,由一系列组节数节组节数节组节数节点成,每个点包含据和指向下一个点成,每个点包含据和指向前一个点成,每个点包含据和指向下一个针单链节针节针链针环链节针点的指向表的最后一个点的指点和下一个点的指双向表的第一个点的指循表的最后一个点的指单链态节节针节环链指向NULL向表的优点是可以动地点的指向前一个点的指指向NULL,指向第一个点循表的优点是可以循节单访问节节节针环访问节环结添加和删除点,缺点是只能向点最后一个点的指向下一个点的指指向点,缺点是需要注意循束条件链访问节NULL双向表的优点是可以双向内储针点,缺点是需要更多的存空间存指栈和队列栈的实现队列的实现应用场景数组链来现栈数数组链来现队栈数调可以使用或表实使用可以使用或表实列使用常用于函用、表达式求值、深度组现栈时栈数组现队时队队实,需要指定的大小,容易实列,需要指定列的大小优先搜索等列常用于广度优先搜索现栈链现栈时现队链现队调队出溢出使用表实,可以,容易出列溢出使用表实、任务度、消息列等态节时态节动地添加和删除点,但需要更多的列,可以动地添加和删除点,但内储针栈现内储针队存空间存指的实需要注意需要更多的存空间存指列的栈满断现队满断的空和的判实需要注意列的空和的判树结构二叉树二叉搜索树节节树结树节节树每个点最多有两个子点的构左子的所有点都小于根点,右子节节树的所有点都大于根点的二叉平衡树简介树过树结左右子的高度差不超1的构排序算法冒泡排序过断较换来现通不比相邻元素并交位置实排序快速排序选择将数组为一个基准元素,分两部分,一部分小于基准元素,一部分大于基准归对进元素,然后递地两部分行排序归并排序将数组为归对进将数分两部分,递地两部分行排序,然后两部分合并成一个有序组搜索算法二分搜索2数组将只能在有序中使用,每次搜索范围缩标小一半,直到找到目元素或搜索线性搜索围为范空1较数组标逐个比元素,直到找到目元素历数组或遍完整个哈希搜索数将标数组3使用哈希函目元素映射到下标访问数组,然后直接元素函数指针函数指针数组1储数针数组现数调存函指的,可以用于实函回回调函数2将数针为数传给数调该数函指作参递另一个函,在特定条件下用函函数指针语法3针数数针类型*指名参列表,用于声明函指高级指针概念Pointer toPointer VoidPointer ConstantPointer Pointerto Constant复杂声明的解析从右到左法则的使用实际案例分析typedef开顺给别简杂过来杂过从变量名始,按照从右到左的序依次用于类型定义名,化复声明通实际案例演示复声明的解析程饰解析类型修符内存管理深入栈与堆内存泄漏内存对齐栈储数调内没释导内资为内访问编译对内用于存局部变量和函用信息,分配的存有被放,致存源了提高存效率,器会储态内费进对堆用于存动分配的存浪存行齐多线程编程基础线程创建与终止数创线数终线使用pthread_create函建程,使用pthread_exit函止程互斥锁资线时访问用于保护共享源,防止多个程同条件变量线现线唤用于程间的同步,实程的等待和醒网络编程入门编程TCP2协议编连基于TCP的程,提供面向接、数传可靠的据输服务编程UDP1协议编连基于UDP的程,提供无接、数传编程基础socket不可靠的据输服务进络编创使用socket API行网程,建连数3socket、接socket、发送据、接收数关闭据、socket性能优化技巧编译器优化1编译选项码执使用器提供的优化,提高代的行效率算法优化2选择时杂杂合适的算法,降低间复度和空间复度代码优化3计码执减少不必要的算,提高代的行效率调试技巧代码风格与规范命名约定注释规范代码格式化数结规则码释内码缩进换变量、函、构体、宏等命名代注的格式和容要求代、空格、行等格式要求版本控制基础基本操作分支管理协作工作流Git创换协开码clone、add、commit、push、pull等建分支、切分支、合并分支等操作多人作发的代管理流程基本操作单元测试测试驱动开发编写测试编写码证码质先用例,再代,保代量编写测试用例针对编写测试不同的功能模块用例,覆盖各种情况测试框架介绍绍单测试介常用的元框架,如JUnit、CppUnit等性能分析工具Valgrind2内调试检测内存工具,可以存泄漏、越访问问题界等perf1Linux性能分析工具,可以分析CPU、内颈存、IO等性能瓶gprof数调3GNU性能分析工具,可以分析函的数执时用次和行间跨平台开发条件编译可移植性考虑跨平台库预编写码尽标库数库简使用#ifdef、#ifndef等处理器指令,根可移植的代,量使用准函使用跨平台,如SDL、Qt等,化跨平选择编译码关开据不同的平台不同的代,避免使用平台相的API台发和新特性C99C11变长数组复合字面量线程支持数组时码创结数组线关进线编大小可以在运行确定可以在代中直接建构体、等提供程相的API,方便行多程字面量程与其他语言的交互C与与C JavaJNI CPython术调扩使用JNI技,可以在Java程序中用C可以使用Python的C展API,在Python码调码代程序中用C代与C C++语调码C++兼容C言,可以在C++程序中用C代嵌入式系统编程实时操作系统时现时调使用实操作系统,如FreeRTOS、RT-Thread等,实实任务度中断处理编写断应中处理程序,响外部事件裸机编程不使用操作系统,直接操作硬件安全编程实践输入验证2对进验证恶用户输入行,防止意输入安全函数使用1数使用安全函,如strncpy、snprintf缓区等,防止冲溢出缓冲区溢出防护3缓区采取措施,防止冲溢出语言的未来发展C标准展望与现代编程的结合语言的持续重要性C2x C标语标预计语现编语结语编开领C2x准是C言的下一个准,会引C言可以与其他代程言合使用C言在系统程、嵌入式发等域仍语现挥势入更多的新特性,提高C言的代化水,发各自的优然具有重要的地位平总结与展望课程回顾进阶学习路径环节QA顾课内语议继续习数结欢问回本程的主要容,包括C言的基建学据构与算法、操作系迎提!语数结数计络数库编译本法、据类型、控制构、函、统、算机网、据、原理等针内预课计层指、存管理、文件操作、处理器程,深入理解算机底原理可以错误数阅读语书计语指令、位操作、处理、命令行参经典C言籍,如《C程序设编编链栈、多文件程、模块化程、表、言》、《C PrimerPlus》、《C陷阱与队树结编开和列、构、排序算法、搜索算法缺陷》等,提高程水平可以参与数针级针杂项践语编、函指、高指概念、复声明源目,实C言程,提高解决实际内线编问题关语的解析、存管理深入、多程程基的能力可以注C言的最新发展础络编调习语习热、网程入门、性能优化技巧、,学C言的新特性,保持学的情试码规技巧、代风格与范、版本控制基础单测试、元、性能分析工具、跨平台开语发、C99和C11新特性、C与其他言编编的交互、嵌入式系统程和安全程实践。
个人认证
优秀文档
获得点赞 0