还剩26页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
C语言基础理论知识欢迎学习C语言基础理论知识课程C语言作为一种强大而灵活的编程语言,已经存在了近50年,但它的重要性和广泛应用性至今仍未减弱本课程将全面介绍C语言的核心概念、语法结构和应用技巧,帮助您建立坚实的编程基础无论您是编程初学者还是希望巩固基础知识的开发者,本课程都将为您提供清晰、系统的学习路径让我们一起深入探索C语言的奥秘,掌握这门经典编程语言的精髓课程概述课程目标通过本课程的学习,学生将掌握C语言的基本语法规则和编程思想,能够独立分析问题并使用C语言编写程序解决实际问题课程旨在培养学生的逻辑思维能力和编程技能,为后续的专业课程学习打下坚实基础学习内容本课程将系统讲解C语言的基本概念、数据类型、运算符、控制结构、数组、函数、指针、结构体等核心内容,同时介绍文件操作、动态内存管理等高级主题每个知识点都会配合丰富的实例和习题,帮助学生更好地理解和应用考核方式课程考核包括平时作业(30%)、上机实验(20%)和期末考试(50%)平时作业主要检验基础知识掌握情况,上机实验重点考察编程实践能力,期末考试则全面评估学习成果学生需认真完成每项考核环节,确保学习效果C语言简介发展历史1C语言由贝尔实验室的丹尼斯·里奇(Dennis Ritchie)于1972年创建,最初用于开发UNIX操作系统1978年,布莱恩·柯林汉(Brian Kernighan)和里奇发布了著名的《C程序设计语言》一书,奠定了C语言的标准1989年,美国国家标准协会(ANSI)发布了C语言的第一个官方标准,即ANSI C主要特点2C语言以其高效性、可移植性和灵活性而著称它是一种中级语言,结合了高级语言的易用性和低级语言的功能性C语言语法简洁明了,允许直接访问内存,支持指针操作,并具有丰富的运算符和数据结构这些特点使得C语言成为系统开发和嵌入式系统的理想选择应用领域3C语言广泛应用于操作系统开发、嵌入式系统、游戏开发、数据库实现、编译器设计等领域许多现代操作系统的核心部分,如Linux内核,都是用C语言编写的此外,C语言还为许多后续的编程语言如C++、Java、Python等提供了语法和设计灵感C语言的优势灵活性1提供高度的程序控制能力可移植性2跨平台适应性强高效性3执行速度快,内存占用少C语言的高效性体现在其接近硬件的特性上,程序执行速度快,内存占用少C程序经过编译后生成的机器码非常高效,几乎没有任何多余的开销,这使得它在资源受限的环境中表现出色可移植性是C语言的另一大优势由于标准化的努力,符合标准的C程序可以在不同的硬件平台和操作系统上运行,只需重新编译而不需要修改源代码这种一次编写,到处编译的特性使C语言成为跨平台开发的理想选择灵活性使C语言能够适应各种编程需求它既可以用于底层系统编程,也可以用于应用程序开发;既可以进行位操作,也可以处理复杂的数据结构这种灵活性让程序员能够根据具体问题选择最合适的解决方案C语言程序的基本结构头文件头文件包含程序中使用的函数和变量的声明通过预处理指令#include将头文件包含到程序中标准头文件如stdio.h(标准输入输出)、stdlib.h(标准库函数)等提供了C语言的标准功能头文件对于代码的模块化和重用至关重要main函数main函数是C程序的入口点,程序的执行从main函数开始每个C程序必须且只能有一个main函数main函数可以返回整型值(通常为0表示程序正常结束)并可以接受命令行参数main函数的基本形式为intmainvoid或int mainintargc,char*argv[]语句和表达式C程序由语句组成,而语句通常包含表达式表达式是可以产生值的组合,如变量、常量、运算符和函数调用的组合语句以分号结束,可以是简单语句(如赋值语句)或复合语句(由花括号{}括起来的一组语句)数据类型
(一)基本数据类型整型浮点型C语言的基本数据类型包括整型、浮点型整型用于表示整数值,包括int(基本整浮点型用于表示实数,包括float(单精、字符型和空类型每种类型都有特定型)、short(短整型)、long(长整型度浮点型)、double(双精度浮点型)的内存占用和表示范围C语言是强类型)和long long(更长的整型)每种整和long double(扩展精度浮点型)浮语言,这意味着每个变量都必须有一个型都有有符号和无符号两种形式,有符点数的表示遵循IEEE754标准,由符号明确的类型,并且不同类型之间的转换号类型可以表示负数,而无符号类型只位、指数和尾数组成浮点运算可能引需要遵循特定的规则能表示非负数不同的整型有不同的内入舍入误差,在要求高精度的场合需要存占用和取值范围特别注意数据类型
(二)布尔型在C89标准中,C语言没有内置的布尔类型,通常字符型使用整型的0表示假,非0表示真C99标准引入空类型了_Bool类型和stdbool.h头文件,提供了bool、字符型(char)用于存储单个字符,通常占用1空类型(void)表示没有类型或没有值它主要true和false的定义,使布尔值的使用更加直观个字节的内存在C语言中,字符实际上是以其用于三种情况指定函数不返回值(void func布尔型主要用于条件判断和逻辑运算中ASCII码值存储的整数例如,字符A的ASCII码)、指定函数不接受参数(int funcvoid)和创是65,因此char c=A与char c=65等效字符建可以指向任何类型的通用指针(void*)空型也有有符号和无符号两种形式,但大多数情况类型是C语言类型系统的重要组成部分,增强了下使用默认的有符号char语言的灵活性213变量变量的定义变量的命名规则变量的作用域变量是内存中的命名存C语言中的变量名必须变量的作用域是指程序储位置,用于存储程序由字母、数字和下划线中可以访问该变量的区处理的数据在C语言组成,且第一个字符必域在C语言中,变量中,定义变量需要指定须是字母或下划线变的作用域主要有局部作变量的类型和名称,可量名区分大小写,不能用域(函数内部定义的选地进行初始化例如使用C语言的关键字(变量)和全局作用域(int count=0;定义了如if、while等)良好函数外部定义的变量)一个名为count的整型的变量命名应当具有描局部变量仅在定义它变量并初始化为0变述性,能够反映变量的的函数或块内可见,全量定义为程序分配了内用途常见的命名风格局变量在整个程序中可存空间,并将变量名与包括驼峰式(见变量的作用域影响该内存位置关联起来firstName)和下划线其生命周期和可见性式(first_name)常量常量的定义常量的类型常量是程序执行过程中值不变的量C语言中的常量包括整型常量(如123与变量不同,常量一旦定义,其值就、0x1A)、浮点常量(如
3.
14、不能被修改在C语言中,常量可以
2.5e-3)、字符常量(如A、\n)是直接写在程序中的字面量(如
42、和字符串常量(如Hello)此外A、Hello),也可以是通过特定,还有枚举常量(enum定义的常量方式定义的命名常量常量的使用可)和符号常量(通过#define或const以提高程序的可读性和可维护性定义的常量)每种类型的常量都有特定的表示方式和使用场景#define与const的区别#define是预处理指令,而const是类型修饰符#define进行的是文本替换,在预处理阶段处理;const则是在编译阶段处理,具有类型检查功能const定义的常量是有类型的,可以进行类型检查;而#define定义的常量没有类型const常量存储在内存中,而#define常量不占用内存空间运算符
(一)1算术运算符2关系运算符算术运算符用于执行基本的数学计关系运算符用于比较两个值之间的算C语言提供的算术运算符包括关系,结果为真1或假0C语言加法+、减法-、乘法*、除法的关系运算符包括等于==、不等/和取模%除法运算符在整数于!=、大于、小于、大于等之间进行运算时执行整除,结果是于=和小于等于=关系运算整数;在浮点数之间进行运算时,符常用于条件语句的条件表达式中结果是浮点数取模运算符只能用,如if、while等注意区分赋值运于整数,返回除法的余数算符=和等于关系运算符==3逻辑运算符逻辑运算符用于组合多个条件表达式,形成更复杂的条件C语言的逻辑运算符包括与、或||和非!逻辑与运算符要求两侧的表达式都为真,结果才为真;逻辑或运算符要求至少一侧表达式为真,结果才为真;逻辑非运算符将真变为假,假变为真运算符
(二)位运算符在二进制位级别操作整数C语言的位运算符包括按位与、按位或|、按位异或^、按位取反~、左移和右移位运算通常用于底层编程,如硬件控制、位图处理和优化位运算比对应的算术运算更高效,特别是在嵌入式系统中赋值运算符用于将值赋给变量基本的赋值运算符是等号=C语言还提供了复合赋值运算符,如+=、-=、*=、/=、%=、=、|=、^=、=和=,这些运算符将赋值与其他操作结合起来,使代码更简洁例如,x+=5等同于x=x+5条件运算符:是C语言中唯一的三元运算符,形式为expr1expr2:expr3如果expr1为真,则整个表达式的值为expr2;否则为expr3条件运算符常用于简单的条件赋值,可以替代简单的if-else语句,使代码更紧凑例如,max=aba:b计算a和b的最大值表达式与语句表达式的定义1计算得出单一值的组合语句的类型2执行特定操作的程序单元表达式语句3以分号结束的表达式表达式是由变量、常量、运算符和函数调用组成的计算式,它计算得出一个值表达式可以是简单的,如单个变量(x)或常量
(5);也可以是复杂的,如包含多个运算符和操作数的组合(a*b+c/d)表达式有类型和值,类型决定了表达式可以参与的操作,值是表达式计算的结果语句是C程序的基本执行单位,以分号结束C语言中的语句类型包括表达式语句、复合语句、选择语句(if、switch)、循环语句(while、for、do-while)、跳转语句(break、continue、return、goto)和空语句语句可以嵌套,形成更复杂的控制结构表达式语句是以分号结束的表达式,如x=5;或printfHello;表达式语句执行表达式的计算,并丢弃计算结果(除非表达式有副作用,如赋值或函数调用)某些表达式(如赋值表达式)在作为语句使用时特别有用,因为它们的副作用是我们关心的输入输出函数函数名功能描述使用示例printf格式化输出到标准输出printfx=%d\n,x;scanf从标准输入读取格式化输入scanf%d,x;getchar从标准输入读取单个字符ch=getchar;putchar将单个字符输出到标准输出putcharch;printf函数用于将格式化的数据输出到标准输出设备(通常是屏幕)它可以输出各种类型的数据,如整数、浮点数、字符和字符串printf函数的第一个参数是格式化字符串,包含普通文本和格式说明符(如%d、%f、%c、%s等)格式说明符表示如何解释和显示后续参数scanf函数用于从标准输入设备(通常是键盘)读取格式化的数据它的使用方式与printf类似,但需要注意的是,scanf函数需要变量的地址(使用运算符获取),而不是变量的值scanf函数在读取失败时可能会导致意外行为,因此在实际应用中需要进行错误检查getchar和putchar函数分别用于读取和输出单个字符getchar函数从标准输入读取一个字符并返回其ASCII码值;putchar函数将一个字符的ASCII码值转换为对应的字符并输出到标准输出这两个函数在处理字符输入输出时比scanf和printf更高效,尤其是在处理大量字符数据时格式化输入输出格式控制符转义字符常见错误格式控制符用于在printf和scanf函数中转义字符用于表示无法直接输入的特殊格式化输入输出中的常见错误包括格式指定数据的输出或输入格式常见的格字符,以反斜杠\开始,后跟特定的字控制符与参数类型不匹配、缺少必要的式控制符包括%d(整数)、%f(浮点数符常见的转义字符包括\n(换行)、\t运算符(在scanf中)、未检查输入函数)、%c(字符)、%s(字符串)和%p(制表符)、\r(回车)、\(双引号)的返回值、缓冲区溢出(特别是在使用(指针)格式控制符还可以包含修饰、\(单引号)和\\(反斜杠)转义字gets函数时)等这些错误可能导致程符,如宽度、精度、对齐方式等,例如符在字符常量和字符串中使用,例如\\t序行为异常、数据损坏甚至安全漏洞%5d表示输出宽度为5的整数,%.2f表示表示制表符的ASCII码,Hello\nWorld良好的编程习惯是仔细检查格式字符串输出小数点后两位的浮点数表示换行和参数的对应关系选择结构
(一)if语句if语句是最基本的选择结构,用于在条件为真时执行特定的代码块语法为if条件{语句块}如果条件评估为非零值(在C语言中视为真),则执行语句块;否则,跳过语句块if语句常用于需要根据条件选择性执行某些操作的场景if-else语句if-else语句扩展了if语句,提供了条件为假时的替代执行路径语法为if条件{语句块1}else{语句块2}如果条件为真,执行语句块1;否则,执行语句块2这种结构确保了两个语句块中的一个会被执行,非常适合于需要在两个选项中选择一个的情况嵌套if语句嵌套if语句是在一个if或else语句内部包含另一个if语句这种结构可以用于处理多重条件,形成决策树例如if条件1{if条件2{语句块A}else{语句块B}}else{语句块C}嵌套if语句可能导致悬空else问题,即不清楚else应该与哪个if配对,解决方法是使用花括号明确标识代码块选择结构
(二)switch语句break和default switch与if的比较switch语句是一种多路分break语句用于中断switch语句和if-else if结支语句,用于根据表达式switch语句的执行流程,构都可以用于多路分支,的值选择多个代码块中的跳出switch语句如果没但有一些差异switch语一个执行语法为有break,程序会继续执句要求表达式是整型,而switch表达式{case常行下一个case,这称为贯if语句可以使用任何类型量1:语句块1;break;case穿(fall-through)的条件表达式switch语常量2:语句块2;break;...default标签是可选的,用句通常更高效,特别是在default:默认语句块;}于指定当表达式的值与任分支较多时,因为它使用表达式的值必须是整型(何case标签都不匹配时执跳转表实现;if-else if结char、int等)switch语行的代码块default标签构则需要逐个评估条件句通过比较表达式的值与通常放在所有case标签之switch语句更适合于基于各个case标签的常量值来后,但这不是必需的单个变量的多个离散值的决定执行哪个代码块选择,而if-else if更适合于复杂条件的评估循环结构
(一)1while循环2do-while循环while循环是一种先判断后执行的循do-while循环是一种先执行后判断环结构,语法为while条件{循的循环结构,语法为do{循环体}环体}在执行循环体之前,先判断while条件;先执行循环体,然后条件是否为真如果条件为真,则再判断条件是否为真如果条件为执行循环体;执行完成后再次判断真,则再次执行循环体;如此重复条件,如此重复,直到条件变为假,直到条件变为假do-while循环如果条件一开始就为假,则循环保证循环体至少执行一次,适用于体一次也不执行while循环适用于需要至少执行一次的情况,如输入不确定循环次数的情况验证3循环的执行流程循环的执行流程包括初始化、条件判断、循环体执行和更新四个步骤初始化步骤设置循环控制变量的初始值;条件判断步骤决定是否执行循环体;循环体执行步骤执行循环体内的语句;更新步骤修改循环控制变量的值,为下一次条件判断做准备这四个步骤的组织方式不同,形成了不同类型的循环结构循环结构
(二)循环嵌套2一个循环内包含另一个循环for循环1初始化、条件判断、更新集成break和continue控制循环执行流程的关键字3for循环是最常用的循环结构,语法为for初始化;条件;更新{循环体}它将循环的三个关键步骤(初始化、条件判断和更新)集成在一起,使代码更紧凑、更易读初始化部分在循环开始前执行一次;条件部分在每次执行循环体前判断;更新部分在每次执行循环体后执行for循环特别适合于确定循环次数的情况循环嵌套是指在一个循环体内包含另一个循环的结构外层循环的每次迭代,内层循环都会完整执行一次例如,双重for循环常用于处理二维数组或矩阵循环嵌套的层数取决于问题的复杂性,但过多的嵌套会降低代码的可读性和效率在实现嵌套循环时,应注意使用不同的循环控制变量break语句用于立即退出当前循环,继续执行循环后的语句它通常与条件语句结合使用,用于在满足特定条件时提前结束循环continue语句用于跳过当前迭代的剩余部分,直接进入下一次迭代在for循环中,continue会跳转到更新部分;在while和do-while循环中,continue会跳转到条件判断部分break和continue是控制循环执行流程的重要工具数组
(一)一维数组的定义和使用数组的初始化一维数组是相同类型元素的集合,在内存C语言提供了多种初始化数组的方法可中连续存储定义一维数组的语法为类以在定义时初始化,如int numbers
[5]=型数组名[大小];,例如int numbers
[5];定{1,2,3,4,5};如果初始化值的数量少于义了一个包含5个整数的数组数组元素通数组大小,剩余元素默认初始化为0也可过索引访问,索引从0开始,到大小-1结束以省略数组大小,让编译器根据初始化值例如,numbers
[0]是第一个元素,的数量确定,如int numbers[]={1,2,3,numbers
[4]是最后一个元素越界访问数4,5};此外,可以指定特定元素的初始值组会导致未定义行为,可能破坏其他数据,如int numbers
[5]={
[0]=1,
[4]=5};,未或导致程序崩溃指定的元素初始化为0数组作为函数参数在C语言中,数组作为函数参数传递时,实际上传递的是数组的首地址,而不是数组的副本这意味着函数可以修改原始数组的内容因为数组大小信息在传递过程中丢失,所以通常需要额外参数指定数组大小,如void processintarr[],int size;或者,可以使用指针语法定义参数,如void processint*arr,int size;,这两种形式在函数内部是等价的数组
(二)二维数组多维数组字符数组二维数组可以视为数组的数组,用于表示表C语言支持多维数组,如三维数组、四维数组等字符数组是存储字符序列的数组,可以用于表格或矩阵数据定义二维数组的语法为类型定义多维数组的语法是类型数组名[第1维大示字符串在C语言中,字符串是以空字符(数组名[行数][列数];,例如int matrix
[3]
[4];定小][第2维大小]...[第n维大小];,例如int\0)结尾的字符数组定义字符数组的语法与义了一个3行4列的整数矩阵二维数组的元素cube
[3]
[4]
[5];定义了一个三维数组多维数组其他数组相同,如char name
[10];初始化字通过两个索引访问,如matrix
[1]
[2]表示第2行的元素通过多个索引访问,如cube
[1]
[2]
[3]符数组可以使用字符串字面量,如char第3列的元素(索引从0开始)二维数组在内多维数组占用的内存空间是各维度大小的乘积name
[10]=Hello;,编译器会自动添加结尾存中是按行存储的,即先存储第一行,然后是,因此高维数组可能占用大量内存在使用多的空字符处理字符数组时,常用的函数包括第二行,以此类推维数组时,应注意内存效率和访问模式strcpy(复制)、strcat(连接)和strcmp(比较)等,这些函数定义在string.h头文件中函数
(一)函数的定义1函数是执行特定任务的代码块,可以重复使用函数的定义包括返回类型、函数名、参数列表和函数体例如int suminta,int b{return a+b;}返回类型指定函数返回值的类型,可以是任何有效的C数据类型或void(表示不返回值)函数名应当反映函数的功能参数列表指定函数接受的输入,可以为空函数体包含函数执行的语句,用花括号括起来函数的声明2函数声明告诉编译器函数的名称、返回类型和参数列表,但不包括函数体例如intsumint a,int b;函数声明通常放在头文件中,或在使用函数之前的源文件中函数声明的主要目的是允许函数在定义之前被调用在C语言中,函数必须先声明后使用,除非定义在调用之前函数声明也称为函数原型,它帮助编译器进行类型检查函数的调用3函数调用是程序执行函数的操作,通过函数名和实参列表实现例如result=sum3,4;当函数被调用时,程序将控制权转移到函数,并为函数的参数分配内存函数执行完成后,程序将控制权返回到调用点,并将函数的返回值赋给接收变量(如果有的话)函数调用可以作为表达式的一部分,如printfSum:%d\n,sum3,4;函数
(二)参数传递返回值函数的递归C语言中函数参数的传递方式是按值传递函数的返回值是函数执行结果返回给调递归是指函数直接或间接调用自身的编,即将实参的值复制给形参这意味着用者的数据返回值的类型由函数定义程技术递归函数必须有基本情况(终函数内对形参的修改不会影响实参例中的返回类型决定使用return语句将止条件)和递归情况基本情况提供了如,void swapinta,int b{int temp=值返回,如return a+b;函数可以返回递归终止的条件,避免无限递归;递归a;a=b;b=temp;}不会真正交换调用者任何类型的值,包括基本类型、结构体情况将原问题分解为更小的子问题常的变量值如果需要修改调用者的变量和指针等如果函数没有返回值,返回见的递归应用包括阶乘计算、斐波那契,可以传递指针(按址传递),如void类型应为void,但可以使用不带值的数列和汉诺塔问题等递归简化了某些swapint*a,int*b{int temp=*a;*a=return语句提前结束函数执行函数只问题的解决方案,但可能导致栈溢出(*b;*b=temp;},调用时使用swapx,能返回一个值,如需返回多个值,可以如果递归深度过大)和性能问题(由于y使用输出参数(通过指针)或返回结构函数调用开销)体存储类别1autoauto是局部变量的默认存储类别,关键字可以省略auto变量存储在栈中,其作用域限于定义它的代码块内当程序执行离开这个代码块时,auto变量的内存空间会被自动释放由于是默认存储类别,实际代码中很少显式使用auto关键字auto变量在每次进入代码块时都会被重新创建并初始化(如果有初始化值的话)2staticstatic存储类别有两种用途局部static变量和全局static变量/函数局部static变量保持其值,即使超出其作用域;它只初始化一次,存储在静态存储区,整个程序生命周期内都存在全局static变量/函数的作用域限于定义它的文件内,不能被其他文件访问,这提供了一种信息隐藏机制static适用于需要在函数调用之间保持状态但又不想使用全局变量的情况3registerregister存储类别建议编译器将变量存储在CPU寄存器中而不是内存中,以提高访问速度这只是一个建议,编译器可以忽略它由于现代编译器的优化能力很强,register关键字的作用已经大大减弱register变量不能取地址(使用运算符),因为寄存器没有内存地址register主要用于频繁访问的变量,如循环计数器4externextern存储类别用于声明在其他文件中定义的全局变量或函数它不分配存储空间,只是告诉编译器变量或函数在其他地方定义例如,extern intglobal_var;声明了一个在其他文件中定义的全局变量extern使得多文件程序开发成为可能,允许在不同文件之间共享变量和函数使用extern时必须确保所有文件中的变量类型一致指针
(一)指针的概念指针的定义和使用指针与数组指针是一种保存内存地址的变量内存地址指向存定义指针的语法是类型*指针名;,如int*p;定义数组名是指向数组第一个元素的常量指针数组名储在计算机内存中的数据通过指针,程序可以间了一个指向整型的指针指针的基本操作包括赋值和指针的区别在于数组名是常量,不能被赋予新接访问和操作这些数据指针是C语言的核心特性、解引用和取址运算符获取变量的地址,如p=值;而指针是变量,可以改变数组元素可以通过之一,为程序员提供了对内存的底层控制指针使x;将x的地址赋给p*运算符解引用指针,访问指下标访问,如arr[i],也可以通过指针访问,如得动态内存分配、复杂数据结构的实现和函数之间针指向的值,如y=*p;将p指向的值赋给y指针也*arr+i这两种表示法是等价的,因为在C语言的高效数据传递成为可能理解指针对于掌握C语可以进行算术运算,如p++使指针指向下一个元素中,arr[i]被编译器翻译为*arr+i指针算术考虑言至关重要(增加的字节数取决于指针的类型)了数据类型的大小,例如,如果p指向int数组的第一个元素,则p+1指向第二个元素指针
(二)指针与函数指针数组多重指针指针在函数参数传递中有重要作用通指针数组是元素为指针的数组声明指多重指针是指向指针的指针例如,int过传递指针,函数可以修改调用者的变针数组的语法是类型*数组名[大小];,如**pp;声明了一个指向整型指针的指针量(按址传递)例如void swapint*a,int*p
[5];声明了一个包含5个整型指针的多重指针的解引用需要多次使用*运算符int*b函数可以交换两个整数的值函数组每个元素p[i]是一个指针,可以指,如**pp访问最终的整数值多重指针数的返回值也可以是指针,如动态内存向一个整数指针数组常用于管理分散常用于动态分配多维数组、传递和修改分配函数malloc返回指向分配内存的指在内存各处的同类数据,如字符串数组指针参数,以及实现某些复杂的数据结针函数指针保存函数的地址,可以用(char*s[]={Hello,World};)在构例如,通过int**动态分配二维数组于实现回调机制函数指针的声明如int这个例子中,s是一个数组,每个元素指,或使用void swap_ptrint**a,int**b*fint,int;,表示f是指向接受两个整数向一个字符串(字符数组)指针数组交换两个指针的值虽然理论上可以有参数并返回整数的函数的指针与数组指针不同,后者是指向数组的指任意级别的指针,但实践中很少使用超针过三级的指针结构体结构体变量结构体变量是基于结构体定义创建的实例声明结构体变量的语法是struct标签名变量名;,如struct Personp1;也可以在定义结构体的同时声明变量struct Person{...}p1,p2;访问结构体成员使用点运算符.,如p
1.age=结构体的定义225;如果有结构体指针p,可以使用箭头运算符-访问结构体是用户定义的复合数据类型,允许存储不同类型成员,如p-age=25;,等同于*p.age=25;结构体变的数据项定义结构体的语法是struct标签名{成员列量可以整体赋值给同类型的结构体变量,如p2=p1;表};例如,struct Person{char name
[50];int age;float height;};定义了一个包含姓名、年龄和身高的1Person结构体结构体成员可以是任何有效的C数据类型结构体数组,包括基本类型、数组、指针,甚至其他结构体结构结构体数组是元素为结构体的数组声明结构体数组的语体的定义通常放在全局范围或函数外部,以便多个函数法是struct标签名数组名[大小];,如struct Person使用3people
[100];访问结构体数组元素的成员使用people[i].name或people+i-name等形式结构体数组常用于存储同类对象的集合,如学生记录、图书信息等在处理大型结构体数组时,考虑使用指针数组可能更高效,特别是在需要对数组元素排序等情况下共用体共用体(union)是一种特殊的数据类型,允许在同一内存位置存储不同类型的数据(但一次只能存储其中之一)定义共用体的语法与结构体类似union标签名{成员列表};例如,union Data{inti;float f;char c;};定义了一个可以存储整数、浮点数或字符的Data共用体共用体的大小等于其最大成员的大小,因为它需要足够的空间来存储任何一个成员共用体的特点是所有成员共享同一内存空间,修改任何一个成员都会影响其他成员例如,如果为union Data变量的i成员赋值,然后读取f成员,得到的将是i的二进制表示被解释为float这种特性使得共用体在内存受限的环境中很有用,但也要求程序员小心使用,确保正确解释存储的数据通常需要额外的标记来记住当前存储的是哪种类型的数据共用体的应用包括节省内存空间,特别是在嵌入式系统中;实现类型转换,如查看浮点数的内部表示;处理可能有多种类型的数据,如网络协议中的不同消息类型此外,共用体经常与结构体结合使用,形成变体记录,例如struct Message{int type;union{int i_data;float f_data;char c_data
[20];}data;};,其中type字段指示data共用体中存储的数据类型枚举类型枚举的定义枚举变量枚举(enum)是一种用户定义的数据类型枚举变量是基于枚举类型定义的变量声明,由一组命名的整型常量组成定义枚举的枚举变量的语法是enum标签名变量名;,语法是enum标签名{枚举常量列表};例如enum Daytoday;可以将枚举常量赋给如,enum Day{MONDAY,TUESDAY,枚举变量,如today=MONDAY;在C语言WEDNESDAY,THURSDAY,FRIDAY,中,枚举变量实际上是整型变量,可以进行SATURDAY,SUNDAY};定义了一个表示星期整数运算,也可以赋予任何整数值,但这样几的枚举类型默认情况下,第一个枚举常做会削弱类型检查的优势最好只将枚举常量的值为0,后续常量的值依次加1也可以量或同类型的枚举变量赋给枚举变量枚举显式指定某些常量的值,如enum Month{变量通常用于表示有限集合中的一个值,如JAN=1,FEB,MAR,...};,这里JAN的值为1,状态、选项或命令FEB为2,以此类推枚举的应用枚举的主要应用是提高代码的可读性和可维护性使用有意义的名称代替魔法数字(无解释的常量)使代码更容易理解例如,使用MONDAY而不是0更清楚地表达了意图枚举还提供了一定程度的类型安全,虽然不如其他语言严格枚举常用于状态机的状态表示、选项标志、错误代码和菜单选择等场景结合switch语句使用枚举可以实现清晰的分支逻辑,编译器还可能提供完整性检查。
个人认证
优秀文档
获得点赞 0