①C语言基础
文章平均质量分 61
C是一个结构化语言,它的重点在于算法和数据结构。在该专栏里将由浅入深的讲解C的各种基本概念,然后重点在于如何将这些理论性的知识转化为实际工程应用中的宝贵经验
xiawucha159
走在路上,感受迎面而来的风!去享受生活
展开
-
基本运算符-算术运算符,优先级
基本运算符-算术运算符,优先级在整数除法中,会出现无法整除的情况,如果实际结果有小数部分,整数除法会丢弃小数部分,这个过程被称为截断。如果,根据加法运算的结合律,从左往右,那应该先计算6*1,但是这又与优先级相矛盾。根据运算符的优先级,先执行乘法运算,再执行加法运算。所以,这个是由编译器决定的,不同的编译器可能两个乘法计算的顺序是不同的。如果,根据 * 的结合律,从左往右,那应该先计算 6 * 1, 但是两个 * 法并不共享同一操作数。乘法运算符用于乘法运算原创 2022-10-06 16:27:45 · 1162 阅读 · 0 评论 -
76.指针与引用的区别
引用不是对象,他只是为已经存在的一个对象起的起的另外一个名字,对其所有的操作都是在与之绑定的对象上进行的,所以他只能绑定一个对象,不能更改绑定对象。引用不是对象,是为对象起的另外一个名字,程序会把引用和对象的初始值绑定,而不是拷贝给引用,无法将引用绑定到另外一个对象上,因此引用必须初始化。2.指针无需在定义时赋值,和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,将拥有一个不确定的值。1.指针本身就是一个对象,允许对指针进行赋值和拷贝,而且在指针的声明周期内,它可以指向几个不同的对象。原创 2023-03-11 23:22:28 · 243 阅读 · 1 评论 -
85.链表总结
链表总结与进阶抽象数据类型(ADT abstract data type)与抽象数据接口(ADI abstract data Interface)链表实际上就是对于结构体、结构体指针和结构体内可以包含指向同类型的结构体指针不可以包含指向同类型的结构体的应用!链表首先有一个指向同类型结构体指针的头指针,头指针之后是结构体节点,每个结构体节点内包含了指向同类型结构体的指针,用于指向下一个结构体节点。原创 2023-03-05 21:59:16 · 528 阅读 · 0 评论 -
84.链表C代码实现
manage_gets这个函数的目的就是为了获取名字的字符串,但是由于fgets系统函数获取到的字符的末尾添加的是“\n”不是“\0”,所以要将“\n”替换成“\0”,而且要照顾软件的边界条件。如果使用current和prev和head觉的比较乱,可以使用a,b,c,d来操作。没有检查malloc是否能够成功分配到内存;无法删除链表中的项;原创 2023-02-28 23:28:37 · 231 阅读 · 0 评论 -
83.链表
但是,如果这样做的话,还需要另外一个指针跟来跟踪新分配的指针,因为使用malloc的返回值是一个指针,需要“另外一个指针”来跟踪新指针。那这“另外一个指针”也需要一个指针来跟踪,,以此类推,需要重新设计结构体才能解决该问题。结构不能含有与结构本身类型相同的结构,但是可以含有指向同类型结构的指针,这是链表的基础。就是在每个结构体中要包含指向下一个结构体next的指针,当创建新结构时,把该结构的地址存储在上一个结构体中。每次使用malloc为新的结构体分配内存空间时,也为指向该结构体的指针(新指针)分配内存。原创 2023-02-27 23:14:36 · 184 阅读 · 0 评论 -
82.链表-发展2
①改进程序的缺点:仍然需要在程序运行时,由用户指定输入的数量,并且有可能出现内存不足的情况或内存浪费的情况。③还有一种情况是整个组织的人员是不确定数量的,每天都在变化,用户可以不确定的添加数据。在发展2中,每输入一个人员信息就使用一次malloc分配内存(for循环实现)发展2可以部分解决①内存浪费的问题,但是不能解决③的问题。②用户需要正确的提供人员的数量,这个值可能会输入错误。链表是怎么发展来的2。原创 2023-02-27 22:43:22 · 55 阅读 · 0 评论 -
81.链表——发展1
在上一篇博客中,其中的程序缺点明显,存在浪费空间的问题,人名限制不太严格不满足需求,人员总数量对有些公司来说太小。总结:数据表示不够灵活,程序在编译时就已经确定了所需的内存空间大小,对此如果能在程序运行时确定会更好。原创 2023-02-21 20:44:35 · 81 阅读 · 0 评论 -
21.操作符优先级和结合性列表,复杂表达式求值顺序
操作符优先级和结合性列表,复杂表达式求值顺序原创 2023-02-13 23:06:33 · 536 阅读 · 0 评论 -
95.C语言-处理字符的库函数
1. strcat 字符串连接(拼接)库函数2. strcpy 字符串复制库函数3. strcmp 字符串比较函数4. strlen5. strwr6. strupr原创 2023-02-13 21:49:12 · 449 阅读 · 0 评论 -
函数的参数与传参
函数的参数与传参数组名或指针作为参数进行传递,它们本身的值实际上都是指针,被调函数的形参获得的是这个指针的一份拷贝。但是如果传递的参数是一个数组名,在被调函数中使用数组下标对数据元素进行修改,这样主调函数中的参数也会被修改。但是,只能把非const的数据的地址赋值给普通指针,将const的数据的地址赋值给普通指针,结果是未定义的,未知的。指向常量的指针通常用于函数的形参中,表明该函数不会使用指针改变传递来的要处理的数据。...原创 2022-07-24 23:15:08 · 355 阅读 · 0 评论 -
数组-高级篇-关于数组名的详解,指针与数组,数组表示法与指针表示法,数组边界,数组序号,const修饰数组
数组-高级篇-关于数组名的详解,指针与数组,数组表示法与指针表示法,数组边界,数组序号,const修饰数组原创 2022-07-10 23:20:12 · 1290 阅读 · 0 评论 -
数组名作为函数参数,传值调用(拷贝),实参与形参
数组名作为函数参数,传值调用(拷贝),实参与形参1.因为数组名是该数组首元素的地址,,作为主调函数要春递给被调函数的实参-数组名,要求形参是一个能够与其匹配的指针。函数如果对数组名进行了下标引用(即在函数中使用了该形参访问或修改数组),实际是对该指针执行了间接访问操作,通过这种间接访问,被调函数可以访问和修改主调函数中的数组元素。这个参数(指针)实际上是通过传值方式传递的,函数得到的是该指针的一份拷贝,它可以被修改,但调用程序所传递的实参并不受影响。...原创 2022-07-24 22:18:10 · 4601 阅读 · 0 评论 -
类型转换、强制类型转换
类型转换、强制类型转换原创 2022-08-02 19:53:30 · 1009 阅读 · 0 评论 -
类型限定符
类型限定符原创 2022-08-07 16:41:35 · 401 阅读 · 0 评论 -
数据类型与数据类型分类
数据类型就是数据的属性和操作,决定了数据在程序中的存在和使用方式。int类型属性:代表一个整数值,该类型值共享整数的属性。int类型:操作-可以改变int类型值的符号,两个int类型值可以相加、相减、相乘、相处、求模。注意:char也属于整数类型,因为它实际上存储的是整数,而不是字符(转换关系见ASCII码表)。数据类型包括:基本数据类型、派生数据类型和抽象数据类型;基本数据类型包括整数类型和浮点数类型;派生数据类型包括布尔类型、指针和聚合类型。聚合类型又包括数组、结构体、枚举和联合。其关系如下图所原创 2022-07-02 22:11:50 · 3105 阅读 · 0 评论 -
翻译单元,编译预处理时出现
翻译单元,编译预处理时源文件和它所引用的头文件是以多个独立的文件存在的。在编译时,C的预处理器会将语言文件中的#include指令替换成头文件的内容,并将多个头文件的内容链接到一起,再与源文件连接到一起。> 编译器会将源代码(.c文件)和该源代码中引用的所有头文件当成仅有一个包含以上所有信息的文件,这个文件成为翻译单元。一个翻译单元对应一个源代码文件和他所包含的头文件!我们认为的多文件在C语言的编译器中可能是以一个文件出现的,描述一个具有文件作用域的变量时,它的实际可见范围是整个翻译单元。...原创 2022-08-02 19:59:45 · 231 阅读 · 1 评论 -
联合(共用体)
联合(共用体)union 联合名{成员列表;} 变量列表;举例:①int data;};hold类型的联合变量。内含 10 个联合变量的数组 union hold * p_fit;指向hold类型联合变量的指针②int data;① 和 ② 是等价的,一个是先定义联合模板,然后定义联合变量;一个是在定义联合模板的时候同时定义联合变量。③与结构体对比int data;};结构体③可以存储一个int型数据、一个double型数据 和 一个char型数据。...原创 2022-08-07 15:43:18 · 609 阅读 · 2 评论 -
逻辑运算符
逻辑运算符当a和b的值发生变化时,两条语句的结果可能会不相同。这个是不确定的,所以一旦由于这种操作引起问题,会非常难以发现。逻辑与&&操作符两侧的条件都为真,整个表达式的值才为真,如果表达式两侧的任何一个条件为假,那么整个表达式的值为假。逻辑或||操作符两侧的条件只要有一个为真,整个表达式的值为真,如果表达式两侧的条件都为假,那么整个表达式的值为假。&&操作符会首先对左侧的子表达式求值,如果它的值为真,然后对右边的子表达式求值。逻辑操作度和位操作符使用时容易混淆,但是它们对运算对象进行的是完全不同的操作。原创 2022-10-06 17:00:44 · 550 阅读 · 0 评论 -
关系运算符-关系运算符的优先级
关系运算符-关系运算符的优先级再将其结果赋值给result,与第二句的效果一样,结果相同。关系运算符的优先级比算术运算符的优先级低,比赋值运算符的优先级高。两者的效果一样,结果相同。但是,在实际编程中,不建议这样写。总结:每个关系运算符都把它左侧的值和右侧的值进行比较。while循环中的内容会执行100次。关系运算符的结合律都是从左往右的。while循环中的内容会执行99次。高优先级: =两者的效果一样,结果相同。低优先级: ==、!用于测试大于等于关系。用于测试小于等于关系。原创 2022-10-06 16:56:31 · 9527 阅读 · 0 评论 -
单目运算符
单目运算符分析一下,n的值只有在被使用之后才会递增为4,根据优先级的规定,++只作用于n,不作用于data + n。如果,n++是表达式的一部分,可将其视为“先使用n,再递增”;而++n则表示,“先递增n,再使用”。此外,还可以根据优先级判断何时使用n的值对表达式求值, 而递增运算符的性质决定了何时递增n的值。出,n,然后输出n的平方。然后递增n,求下一个。对整形操作数执行求补操作,操作数中原来所有为1的位变为0,为0的位变为1。如果一个参数出现在函数的多个实参中,不要对其使用递增和递减运算符。原创 2022-10-06 16:48:57 · 10736 阅读 · 0 评论 -
结构体声明的三种形式和使用typedef声明定义结构体类型
结构体声明的三种形式和使用typedef声明定义结构体类型int page;};-创建结构体变量int page;} Shot;} Shot;int page;} BOOK_T;int page;};原创 2022-10-06 16:12:57 · 503 阅读 · 0 评论 -
结构体自引用
结构体自引用使用typedef创建SELF_CONTAIN并且其结构成员可以自引用,但是上述示例在定义mu时,SELF_CONTAIN并没有创建,所以在结构体内部定义mu时,结构体类型并没有创建,所有不合法。结构体内部包含一个指向该结构体本身的指针,事实上,该指针所指向的是同一种类型的不同的结构体,链表和树就是使用这种技巧实现的。这个错误示例与结构体初始化的方式有关,如果声明时省略结构体名(结构标签),使用结构体指针自引用也是不合法的!结构体内部的成员是否可以是该结构体本身。即结构体是否可以包含结构体本身原创 2022-10-06 16:05:17 · 2024 阅读 · 3 评论 -
结构体作为函数的参数
结构体作为函数的参数使用结构体变量作为函数的参数时,也是传值的,会将结构体变量的全部内存单元的内容拷贝一份传递给被调函数。在传值的过程中,程序的空间和时间开销比较大,且传递的是一份拷贝,并不能改变实参本身的值。在被调函数modify中,要使用指向运算符->访问结构体成员或者使用括号,因为他的参数是一个结构体指针。只要结构体成员是一个具有单个值的数据类型,便可把它作为参数传递给接受该特定类型的函数。结构体变量名与数组变量名不同,结构体变量名不是它的地址。如果在被调函数中要修改结构体成员的值,原创 2022-10-06 15:57:06 · 6357 阅读 · 0 评论 -
结构体数组与结构体指针
结构体数组与结构体指针结构体变量可以使用“.”运算符,当对结构体指针使用.运算符时,一定要使用括号,因为 . 运算符的优先级是最高的,如果不使用括号,就会先执行点运算后执行 “*” 运算。注意:结构体变量名与数组名的含义是不同的,结构体变量名并不是该变量的地址,因此需要在结构体变量名前加上取址运算 “&”。lib_point是结构体的地址,也是第一个成员title的地址,虽然两个地址是相同的,但是它们的类型是不同的。疑问:既然lib是一个数组(结构体数组),那lib就是数组名,也就是数组的首地址,原创 2022-10-06 15:39:05 · 6867 阅读 · 2 评论 -
结构体引用和初始化
结构体引用和初始化int page;};int page;} IVA;只有在初始化时才可以对结构体变量整体赋值,除此之外,只能分别给每个成员变量赋值!并且不可以在结构体内部给结构体变量的每个成员赋值。错误举例:不能先定义IVA后,再整体初始化IVA = {//错误做法错误举例:不可以在结构体内部给结构体变量的每个成员赋值} IVA;原创 2022-10-05 23:21:02 · 2804 阅读 · 0 评论 -
结构体是什么、声明和定义
结构体基础-结构体的概念、声明和定义结构体是C语言中的一种自己定义构造的类型,它由若干个结构体“成员”组成。其中的每个成员可以是基本数据类型,可以是其他的构造类型。(引出文章-结构体成员可以包含本结构体自身吗-即结构体可以自引用吗?)声明结构体使用关键字structstruct 结构体名 {成员列表;};这样“struct+结构体名” 就构成了一个新的类型名。struct 结构体名 {成员列表;};结构体类型名 变量名列表;int page;};struct 结构体名 {成员列表;} 变量名列表;原创 2022-10-02 08:38:41 · 4229 阅读 · 0 评论 -
作用域,链接,存储期关系综合分析,存储类别总结
作用域,链接,存储期关系综合分析,存储类别总结存储类别主要包括自动,寄存器,静态无链接,静态内部链接,静态外部链接。①自动—在块中不带存储类别说明符或者带auto存储类别说明符的变量(或作为函数头中的形参)属于自动存储类别,具有 自动存储期,块作用域,无链接。如果未初始化自动变量,它的值是未定义的,即垃圾值。②寄存器—在块中带register存储类别说明符声明的变量(或作为函数头中的形参)属于寄存器存储类别址。把一个变量声明为寄存器变量即请求编译器将其存储到访问速度最快的区域。...原创 2022-08-07 16:34:21 · 183 阅读 · 0 评论 -
多维数组、数组在内存中的存储顺序、指向数组的指针的解释与声明
多维数组、数组在内存中的存储顺序、指向数组的指针的解释与声明四种数据类型的结构如上图,他们在内存中存储的顺序也是按照上图排序存储的。如上图,数组中的元素是顺序存储的,多维数组的存储顺序是按照最右边的下表先变化的原则,称为行主续。举例:存储顺序为:其中0和1为下表序号。二维数组:三维数组:4.指针和多维数组的关系对于二维数组:从数组的角度:总结:对于以上二维数组,该数组的首元素是一个内含两个int值的数组。...原创 2022-08-06 23:29:37 · 2559 阅读 · 1 评论 -
const关键字,详解常量指针与指针常量
常量指针,指针指向的值不能变。(不能使用指针改变所指向的地址内的值)。指针常,指针自身的值不能变(指针里面存放的内存地址不能修改,但是可以改变他指向的变量的值)原创 2022-07-17 18:47:50 · 1214 阅读 · 0 评论 -
数组-基础篇,数组基础概念,一维数组定义、引用与初始化
数组是由数据类型相同的一组元素组成的一种数据结构,在内存中顺序存放。数组包括:一维数组,二维数组,多维数组。一维数组是最常使用的,二维数组和多维数组使用较少。在函数传参和使用返回值时,对数组的操作要特别注意,这一部分会在《数组-高级》博客中介绍。一维数组只存储一组相同类型的数据,可以使用数组名和下标的组合可以访问一维数组中的任意元素。下标是数组元素对应的序号,即中括号和其中的序号!特别强调一下对应关系,数组的下表序号从0开始,到n-1结束。数组的大小要显示的声明,在定义的时候就要确定好数组的大小,这是原创 2022-07-10 10:19:42 · 1358 阅读 · 0 评论 -
异常保护(异常处理),项目中可以使用的一种高效的方法! return的妙用
异常保护(异常处理),项目应用中一种高效的方法!return的妙用实用举例:在进入函数时,检查重要参数,如果不符合实用要求,则退出函数,不在执行后面的功能代码,提高程序效率。原创 2022-06-29 23:55:38 · 190 阅读 · 0 评论 -
static关键字的作用,变量加入static以后在内存中存储位置的变化
static关键字的作用,变量加入static以后在内存中存储位置的变化的链接属性、存储类型、生存期(存储期)。无法修改标识符的作用域,比如全局变量和static修饰过的全局变量,其作用域是一样的,只是链接属性不一样,一个可以被其他文件引用,一个不能被其他文件引用。可以修饰变量、类型和函数。修改变量的链接属性(变量名也是标识符)(通俗理解-就是在哪些地方可以用它)。但是标识符的作用域和存储类型不受影响(代码块外的变量和函数都属于静态存储,作用域是自声明后到原创 2022-06-29 23:36:21 · 1180 阅读 · 0 评论 -
continue和break使用说明
举例:1.continue 的作用 跳出 i = “某个值“”时的当前循环。在本例中,当i=6时,跳出当前次循环,所以程序最后执行的结果是:0,1,2,3,4,5,7,8,92.break 的作用 跳出整个for循环,在本例中,当i=6时,跳出for循环,所以程序最后执行的结果是:0,1,2,3,4,5注意:...原创 2022-06-24 23:21:38 · 1318 阅读 · 0 评论 -
标识符的命名和使用 规则
使用标识符时要遵循以下规则:ANSIC 标准规定,标识符可以为任意长度,但外部名必须至少能由前8个字符唯一地区分。这是因为某些编译器自身色剂特性的原因(如 IBM P仅能识别前8个字符)。标识符不能和 C 语言的关键字相同,也不能和用户已编写的函数或 C 语言库函数同名。...原创 2022-06-24 23:04:26 · 4562 阅读 · 0 评论 -
C程序访问内存的方法、存储类型(存储类别)、存储期、对象、左值 详解
即C语言程序在内存中存储数据的存储类别,C语言有多种不同的存储类别。从硬件角度上看,被存储的每个值都占用一定的物理内存,C语言把这样的一块内存称为对象。通过声明变量实现,创建标识符,标识符可以指定特定对象的内容。标识符是一个名称,在这种情况下,标识符可以用来指定(designate)特定对象的内容。举例:声明了一个名称叫 data_object 的标识符,这个标识符是一个变量。可以指定特定(分配的内存位置)对象的内容。!!标识符不是指定对象的唯一途径,还可以使用指针。pt 是一个标原创 2022-06-24 22:16:48 · 1243 阅读 · 0 评论 -
什么是链接属性,外部链接,内部链接,无链接详解
什么是链接属性,外部链接,内部链接,无链接详解从原始代码生成可执行的目标文件需要经过—编码,预处理,编译,汇编,链接,执行等过程。在此处提及是为了让知识能够串联起来,了解什么是链接属性,为什么需要链接属性,链接属性的作用。链接属性就是在链接过程中的一些规定:工程的所有源文件被编译后,规定了标识符在多个文件中多次出现时,当做一个实体处理还是多个实体处理。标识符有三种链接属性:外部链接,内部链接,无链接。注意:关键字extern和static用于在声明中修改标识符的链接属性。...原创 2022-06-13 22:28:58 · 2154 阅读 · 1 评论 -
什么是基本语句、复合语句,程序的基本结构
什么是基本语句、复合语句,程序的基本结构原创 2022-06-13 20:30:01 · 1133 阅读 · 0 评论 -
变量的定义与声明&函数的定义与声明,如何引用其他文件的变量,static和extern在声明中所起的作用
变量的定义与声明&函数的定义与声明,如何引用其他文件的变量,static和extern在声明中所起的作用原创 2022-06-13 17:11:55 · 618 阅读 · 0 评论 -
什么是作用域?作用域分类与简介
什么是作用域?规定了程序中可以访问标识符的区域。当变量或函数在文件的某个位置被声明后,那么只能在特定的区域内才能访问这些内容。这个区域就是由标识符的作用域决定的。标识符的作用域就是在程序代码中,可以使用该标识符的区域。作用域可以分为:(编译器识别)文件作用域,函数作用域,代码块作用域(块作用域),原型作用域标识符声明的位置决定它的作用域。1.文件作用域:***在代码块之外声明的标识符都具有文件作用域,表示该标识符从声明处开始到文件结尾结束都可被访问。在文件中定义的函数名也具有文件作用域,函原创 2022-05-26 22:14:18 · 4699 阅读 · 0 评论 -
什么是标识符?C语言关键字引出与简介
什么是标识符?标识符是变量、类型、函数等的名字。命名规则:1.只能由大小写字母、数字和下划线组成,且不能以数字开头!2.长度无限制,但是一般不超过32个字符。c语言的关键字c语言的关键字是不能做为标识符使用的,需保留!这些关键字可以修饰标识符。包括:1. 存储类别说明符auto 存储类别说明符,将变量声明为自动变量,只能用于块作用域的变量声明中。static 存储类别说明符,将变量声明为静态变量,用static说明符创建的对象具有静态存储期,载入程序时创建对象,当程序结束时对.原创 2022-05-26 22:03:26 · 1196 阅读 · 0 评论