C语言重难点
文章平均质量分 71
主要是记录C语言的重难点
黑子的ball
忙着赶路
无暇采风
展开
-
C语言(预处理)
1.C语言预处理理论1.1、由源码到可执行程序的过程(1)源码.c->(编译)->elf可执行程序(2)源码.c->(编译)->目标文件.o->(链接)->elf可执行程序(3)源码.c->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序(4)源码.c->(预处理)->预处理过的.i源文件->(编译)->汇编文件.S->(汇编)->目标文件.o->(原创 2021-05-13 13:17:51 · 126 阅读 · 0 评论 -
C语言总结3(多文件C语言项目)
3、多文件C语言项目3.1、简单的C语言程序(项目)只有一个C文件(a.c),编译的时候gcc a.c -o a,执行的时候./a3.2、复杂的C语言程序(项目)是由多个C文件构成的。譬如一个项目中包含2个c文件(a.c, b.c),编译的时候 gcc a.c b.c -o ab,执行的时候 ./ab实验:在a.c和b.c中分别定义main函数,各自单独编译时没问题;但是两个文件作为一个项目来编译gcc a.c b.c -o ab的时候,就会报错。multiple definition of `ma原创 2021-04-12 14:14:52 · 1210 阅读 · 1 评论 -
C语言总结2(变量和常量)
2、变量和常量2.1、变量变量,指的是在程序运行过程中,可以通过代码使它的值改变的量。2.1.1、局部变量定义在函数中的变量,就叫局部变量。2.1.1.1、普通局部变量(auto)普通的局部变量定义时直接定义,或者在定义前加auto关键字void func1(void){ int i = 1; i++; printf("i = %d.\n", i);}局部变量i的解析:在连续三次调用func1中,每次调用时,在进入函数func1后都会创造一个新的变量i,并且给它赋初值1原创 2021-04-11 20:14:55 · 340 阅读 · 0 评论 -
程序结构(顺序结构、选择结构、循环结构)
程序结构在C语言程序里,一共有三种程序结构:顺序结构、选择结构(分支结构)、循环结构1、顺序结构:按照实物本身特性,必须一个接着一个来完成。2、选择结构:到某个节点后,会根据一次判断结果来决定之后走哪一个分支。3、循环结构:循环结构有一个循环体,循环体是一段代码。对于循环结构来说,关键在于根据判断的结果,来决定循环体执行多少次。总结:对于顺序结构来说,不需判断,因为下一句指令就是你要执行的。对与循环与选择结构来说,都需要进行判断。然后根据判断结果来决定怎么办。逻辑上有一种类型,叫bool类型(又写转载 2021-04-07 22:00:57 · 17769 阅读 · 0 评论 -
C语言总结1(数据类型)
1、数据类型1.1、基本数据类型数据类型分2类:基本数据类型+复合类型基本类型:char short int long float double复合类型:数组 结构体 共用体 类(C语言没有类,C++有)1.1.1、内存占用与sizeof运算符数据类型就好像一个一个的模子,这个模子实例化出C语言的变量。变量存储在内存中,需要占用一定的内存空间。一个变量占用多少空间是由变量的数据类型决定的。每种数据类型,在不同的机器平台上占用内存是不同的。我们一般讲的时候都是以32位CPU为默认硬件平台来描述:原创 2021-04-11 09:19:27 · 156 阅读 · 0 评论 -
C语言结构体
结构体、共用体、枚举、宏定义、预处理1.1、结构体1.1.1、为什么需要结构体?没有结构体之前,在C语言中,数据的组织依靠:变量+数组。最初最简单的时候,只需要使用基本数据类型(int char float double)来定义单个变量,需要几个变量就定义几个。后来情况变复杂了,有时需要很多意义相关的变量(譬如需要存储及运算一个班级的学生分数)这时候数组出现了。数组解决了需要很多类型相同、意义相关的变量的问题。但是数组是有限制的。数组最大的不足在于,一个数组只能存储很多个数据类型相同的变量。所原创 2021-04-07 21:53:59 · 875 阅读 · 0 评论 -
C语言指针
指针指针全称是指针变量,其实质是C语言的一种变量。这种变量比较特殊,通常它的值会被赋值为某个变量的地址值(p = &a),然后我们可以使用p这样的方式去间接访问p所指向的那个变量。*1.1、为什么需要指针?指针存在的目的就是间接访问。有了指针之后,我们访问变量a不必只通过a这个变量名来访问。而可以通过p = &a; *p = xxx;这样的方式来间接访问变量a。1.2、两种重要运算符:&和*&:取地址符,将它加在某个变量前面,则组合后的符号代表这个变量的地址值。例原创 2021-04-05 16:39:05 · 178 阅读 · 0 评论 -
C语言数组
数组到目前为止,我们已经学习了C语言的基本数据类型:整形、浮点型、字符型。再往后就是复合数据类型。所谓复合数据类型,是指由简单数据类型,经过一定的数据结构封装,组成而成的新的数据类型。譬如数组、譬如结构体、譬如公用体1.1、为什么需要数组?数组就是数组成一个组,数就是一个特定数据类型的变量,组就是说好多数放在了一起。1.2、怎么定义数组?int a[4]; 数组中元素类型 数组名[数组元素个数];总结:数组中的所有元素必须是同一种数据类型,不可能在一个数组中存储两种数据类型的数。1.3原创 2021-03-30 21:34:41 · 196 阅读 · 2 评论 -
C语言的函数
函数当程序简单的时候,一个人可以用一个main函数搞定功能。当程序变成的时候,超出了人的大脑承受范围,这时候逻辑不清了。这时候就需要把一个大程序分成许多小的模块来组织,于是乎出现了概念叫做函数。函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成。这就是程序设计的基本分化方法。之前接触过的函数:main:C语言中所谓的主函数,主函数就是一种特别的函数。特别之处在于,一个C语言程序有且仅有一个main函数。C语言规定,一个C语言程序从主函数开始执行,到主函数执行原创 2021-03-30 10:21:40 · 552 阅读 · 0 评论 -
C语言常用运算符
C语言常用运算符1.1、数学运算符号1.1.1、常见数学运算符号,跟数学中理解相同+加号-减号*乘号/ 除号,相除以后的商% 取余符号,相除以后余数是几() 括号括起来优先级最高,先计算练习题目:#include <stdio.h>int main(void){ int a, b, c, d, e; a = 13; b = 4; c = 7; d = a + b / c; // C语言中,运算优先级等同于数学中,所以先乘除后加减(d=13) e原创 2021-03-23 21:23:17 · 661 阅读 · 2 评论 -
C语言数据类型
C语言数据类型1.1、整型C语言中的整型对应数学中的整数,整型变量是用来描述一个整数值的,整型变量经过计算后也只能是整数(整型),不可能出现小数(浮点型).学习要求:要学会整形变量的定义,赋值,计算要学会使用printf函数打印出一些整形变量的值,作为输出和调试。C语言中整形有三种:(1)int 整形(2)short int,又叫做short,短整形(<=整形)(3)long int,又叫做long,长整型(>=整形)练习题目:#include <stdio.h&原创 2021-03-21 17:24:58 · 860 阅读 · 0 评论 -
C语言基础入门:hello world(VMWare共享文件夹补充)
1.1、概念:*源文件:源文件即源代码文件,C语言源文件后缀名是.c。*头文件:头文件后缀名为.h(head,头),C语言代码由源文件和头文件组成。*关键字:关键字是C语言征用了的一些字,这些字在C语言中代表特殊含义,已经被C语言定义好了,轮不到我们用了。每个关键字都有自己特定的含义,我们必须搞懂每个关键字的所有含义和用法,否则就看不懂C语言程序。C语言常用关键字:include(包含) 头文件包含int(integer,整数) 用来表示一个整数的类型叫整形。float(浮点型)原创 2021-03-21 12:50:49 · 358 阅读 · 2 评论 -
C语言链表8(状态机和多线程)
8.、什么是状态机8.1、有限状态机(1)常说的状态机是有限状态机FSM。FSM指的是有有限个状态(一般是一个状态变量的值),这个机器同时能够从外部接收信号和信息输入,机器在接收到外部输入的信号后会综合考虑当前自己的状态和用户输入的信息,然后机器做出动作:跳转到另一个状态。(2)考虑状态机的关键点:当前状态、外部输入、下一个状态8.2、两种状态机:Moore型和Mealy型(1)Moore型状态机特点是:输出只与当前状态有关(与输入信号无关)。相对简单,考虑状态机的下一个状态时只需要考虑它的当前状原创 2021-06-13 12:37:14 · 624 阅读 · 1 评论 -
C语言链表7
7、linux内核链表7.1、前述链表数据区域的局限性(1)之前定义数据区域时直接int data;我们认为我们的链表中需要存储的是一个int类型的数。但是实际上现实编程中链接中的节点不可能这么简单,而是多种多样的。(2)一般实际项目中的链表,节点中存储的数据其实是一个结构体,这个结构体中包含若干的成员,这些成员加起来构成了我们的节点数据区域。7.2、一般性解决思路:数据区封装为一个结构体(1)因为链表实际解决的问题是多种多样的,所以内部数据区域的结构体构成也是多种多样的。这样也导致了不同程序当中原创 2021-06-11 09:38:43 · 125 阅读 · 1 评论 -
C语言链表6
6、双链表的算法之遍历节点(1)双链表是单链表的一个父集。双链表中如何完全无视pPrev指针,则双链表就变成了单链表。这就决定了双链表的正向遍历(后向遍历)和单链表是完全相同的。(2)双链表中因为多了pPrev指针,因此双链表还可以前向遍历(从链表的尾节点向前面依次遍历直到头节点)。但是前向遍历的意义并不大,主要是因为很少有当前当了尾节点需要前向遍历的情况。(3)总结:双链表是对单链表的一种有成本的扩展,但是这个扩展在有些时候意义不大,在另一些时候意义就比较大。因此在实践用途中要根据业务要求选择适合的原创 2021-06-09 16:00:08 · 92 阅读 · 0 评论 -
C语言链表5
5、双链表的引入和基本实现5.1、单链表的局限性(1)单链表是对数组的一个扩展,解决了数组的大小比较死板不容易扩展的问题。使用堆内存来存储数据,将数据分散到各个节点之间,其各个节点在内存中可以不相连,节点之间通过指针进行单向链接。链表中的各个节点内存不相连,有利于利用碎片化的内存。(2)单链表各个节点之间只由一个指针单向链接,这样实现有一些局限性。局限性主要体现在单链表只能经由指针单向移动(一旦指针移动过某个节点就无法再回来,如果要再次操作这个节点除非从头指针开始再次遍历一次),因此单链表的某些操作就原创 2021-06-08 16:01:40 · 95 阅读 · 0 评论 -
C语言链表4
4、单链表的算法之逆序4.1、什么是链表的逆序(1)链表的逆序又叫反向,意思就是把链表中所有的有效节点在链表中的顺序给反过来。4.2、单链表逆序算法分析(1)当我们对一个数据结构进行一个操作时,我们就需要一套算法。这就是数据结构和算法的关系。(2)我总结:算法有2个层次。第一个层次是数学和逻辑上的算法;第二次个层次是用编程语言来实现算法。(3)从逻辑上来讲,链表的逆序有很多种方法。这些方法都能实现最终的需要,但是效率是不一样的。彼此的可扩展性、容错性等不同。(4)思路:首先遍历原链表,然后将原原创 2021-06-08 09:15:24 · 97 阅读 · 0 评论 -
C语言链表3
3、单链表的算法之遍历节点3.1、什么是遍历(1)遍历就是把单链表中的各个节点挨个拿出来,就叫遍历。(2)遍历的要点:一是不能遗漏、二是不能重复、追求效率。3.2、如何遍历单链表(1)分析一个数据结构如何遍历,关键是分析这个数据结构本身的特点。然后根据本身特点来制定它的遍历算法。(2)单链表的特点就是由很多个节点组成,头指针+头节点为整个链表的起始,最后一个节点的特征是它内部的pNext指针值为NULL。从起始到结尾中间由各个节点内部的pNext指针来挂接。由起始到结尾的路径有且只有一条。单链表原创 2021-06-03 21:25:31 · 79 阅读 · 0 评论 -
C语言链表2
2、单链表的算法之插入节点2.1、继续上节,访问链表中各个节点的数据(1)只能用头指针,不能用各个节点自己的指针。因为在实际当中我们保存链表的时候是不会保存各个节点的指针的,只能通过头指针来访问链表节点。(2)前一个节点内部的pNext指针能帮助我们找到下一个节点。2.2、将创建节点的代码封装成一个函数(1)封装时的关键点就是函数的接口(函数参数和返回值)的设计2.3、从链表头部插入新节点2.3.1、什么是头节点(1)问题:因为我们在insert_tail中直接默认了头指针指向的有一个节转载 2021-06-02 21:01:48 · 100 阅读 · 0 评论 -
C语言链表1
1、链表的引入1.1、数组的缺陷(1)数组有两个缺陷:一个数组中所有的元素类型必须一致;数组中的元素个数必须事先制定并且一旦制定之后不能更改(2)数组缺陷的解决方法:第一个缺陷靠结构体去解决,结构体允许的元素的类型不相同。(3)数组缺陷的解决方法:第二个缺陷制作链表,因为链表实际上就是一个元素个数可变的数组。1.2、链表是怎样的(1)链表就是用锁链连接起来的表。这里的表指的是一个一个的节点,节点中有一些内存可以用来存储数据;这里的锁链指的是链接各个表的方法,C语言中用来连接2个表的方法就是指针。原创 2021-06-01 07:59:06 · 173 阅读 · 0 评论 -
C语言作用域、生长周期、链接属性
1、作用域详解1.1、局部变量的代码块作用域(1)代码块基本可以理解为一对大括号{}括起来的部分。(1)代码块不等于函数,因为if while for都有{}。所以代码块<=函数(3)局部变量的作用域是代码块作用域,也就是说一个局部变量可以被访问和使用的范围仅限于定义这个局部变量的代码块中定义式之后的部分。2、函数名和全局变量的文件作用域(1)文件作用域的意思就是全局的访问权限,也就是说整个.c文件中都可以访问这些东西。这就是平时所说的局部和全局,全局就是文件作用域。(2)详细准确地说就原创 2021-05-28 15:13:55 · 184 阅读 · 0 评论 -
C语言(存储类的关键字)
1、存储类的关键字1.1、auto(1)auto关键字在C语言中只有一个作用,那就是修饰局部变量(2)auto修饰局部变量,标志这个局部变量是自动局部变量,自动局部变量分配在栈上。(也就是说如果不初始化,那么值就是随机的)(3)平时定义局部变量时就是定义的auto的,知识省略了auto关键字而已,所以auto的局部变量其实就是默认定义的普通的局部变量1.2、static(1)static关键字在C语言中有2种方法,而且这两种用法彼此没有任何关联,完全是独立的。(2)static的第一种用法是:原创 2021-05-25 15:48:09 · 648 阅读 · 0 评论 -
C语言(内存映像)
2.linux下C程序的内存映像2.1、代码段、只读数据段(1)对应着程序中的代码(函数),代码段在linux中又叫文本段(.text)(2)只读数据段就是在程序运行期间只能读不能写的数据,const修饰的常量有可能是存在只读数据段的(但是不一定,const常量的实现方法在不同平台是不一样的)2.2、数据段、bss段(1)数据段存:1、显式初始化为非0的全局变量;2、显式初始化为非0的static局部变量(2)bss段存:1、显式初始化为0或者未显式初始化的全局变量;2、显式初始化为0或未显式初原创 2021-05-18 15:23:21 · 367 阅读 · 0 评论 -
C语言(存储类、作用域、生长周期、链接属性)概念1
1.概念解析1.1、存储类(1)存储类就是存储类型,也就是描述C语言变量在何种地方存储。(2)内存有多种管理方法:栈、堆、数据段、bss段、.text段······一个变量的存储类属性就是描述这个变量存储在何种内存段中。(3)譬如:局部变量分配在栈上,所以它的存储类就是栈;显式初始化为非0的全局变量分配在数据段,显式初始化为0和没有显示初始化(默认为0)的全局变量分配在bss段。1.2、作用域(1)作用域是描述这个变量起作用的代码范围。(2)基本来说,C语言变量的作用域规则是代码块作用域。意思原创 2021-05-18 15:22:43 · 118 阅读 · 0 评论 -
C语言(静态链接库和动态链接库)
7.自己制作静态链接库并使用(1)第一步:自己制作静态链接库首先使用gcc -c只编译不连接,生成.o文件;然后使用ar工具进行打包成.a归档文件库名不能随便乱起,一般是lib+库名称,后缀名是.a表示是一个归档文件注意:制作出来了静态库之后,发布时需要发布.a文件和.h文件。(2)第二步:使用静态链接库把.a和.h都放在我引用的文件夹下,然后在.c文件中包含库的.h,然后直接使用库函数。第一次,编译方法:gcc test.c -o test报错信息:test.c:(.text+0xa):原创 2021-05-17 09:18:35 · 649 阅读 · 2 评论 -
C语言(函数库)
4.函数库4.1、什么是函数库?(1)函数库就是一些事先写好的函数的集合,给别人复用。(2)函数是模块化的,因此可以被复用。我们写好了一个函数,可以被反复使用。也可以A写好了一个函数然后共享出来,当B有相同的需求时就不需自己写直接用A写好的这个函数即可。4.2、函数库的由来(1)最开始是没有函数库,每个人写程序都要从零开始自己写。时间长了慢慢的早期的程序员就积累下来了一些有用的函数。(2)早期的程序员经常参加行业聚会,在聚会上大家互相交换各自的函数库。(3)后来程序员中的一些大神就提出把大家各原创 2021-05-13 20:32:02 · 1653 阅读 · 1 评论 -
C语言(函数)
3.函数的本质3.1、C语言为什么会有函数(1)整个程序分成多个源文件,一个文件分成多个函数,一个函数分成多个语句,这就是整个程序的组织形式。这样组织的好处在于:分化问题、便于编写程序、便于分工。(2)函数的出现是人(程序员和架构师)的需要,而不是机器(编译器、CPU)的需要。(3)函数的目的就是实现模块化编程。说白了就是为了提供程序的可移植性。3.2、函数书写的一般原则:第一:遵循一定格式。函数的返回类型、函数名、参数列表等。第二:一个函数只做一件事:函数不能太长也不宜太短,原则是一个函数只原创 2021-05-13 15:00:54 · 270 阅读 · 0 评论 -
C语言(宏定义)
2.宏定义2.1、宏定义的规则和使用解析(1)宏定义的解析规则就是:在预处理阶段由预处理器进行替换,这个替换是原封不动的替换。(2)宏定义替换会递归进行,直到替换出来的值本身不再是一个宏为止。(3)一个正确的宏定义式子本身分为3部分:第一部分是#dedine ,第二部分是宏名 ,剩下的所有为第三部分。(4)宏可以带参数,称为带参宏。带参宏的使用和带参函数非常像,但是使用上有一些差异。在定义带参宏时,每一个参数在宏体中引用时都必须加括号,最后整体再加括号,括号缺一不可。宏定义示例1:MAX宏,求2转载 2021-05-13 14:53:15 · 1440 阅读 · 0 评论 -
C语言(枚举)
12.枚举12.1、枚举是用来干嘛的?(1)枚举在C语言中其实是一些符号常量集。直白点说:枚举定义了一些符号,这些符号的本质就是int类型的常量,每个符号和一个常量绑定。这个符号就表示一个自定义的一个识别码,编译器对枚举的认知就是符号常量所绑定的那个int类型的数字。(2)枚举中的枚举值都是常量,怎么验证?(3)枚举符号常量和其对应的常量数字相对来说,数字不重要,符号才重要。符号对应的数字只要彼此不相同即可,没有别的要求。所以一般情况下我们都不明确指定这个符号所对应的数字,而让编译器自动分配。(编译转载 2021-05-13 09:42:14 · 139 阅读 · 0 评论 -
C语言大小端模式
11.大小端模式11.1、什么是大小端模式(1)大端模式(big endian)和小端模式(little endian)。最早是小说中出现的词,和计算机本来没关系的。(2)后来计算机通信发展起来后,遇到一个问题就是:在串口等串行通信中,一次只能发送1个字节。这时候我要发送一个int类型的数就遇到一个问题。int类型有4个字节,我是按照:byte0 byte1 byte2 byte3这样的顺序发送,还是按照byte3 byte2 byte1 byte0这样的顺序发送。规则就是发送方和接收方必须按照同样的转载 2021-05-12 20:57:46 · 768 阅读 · 0 评论 -
C语言共用体union
10.共用体union10.1、共用体类型的定义、变量定义和使用(1)共用体union和结构体struct在类型定义、变量定义、使用方法上很相似。(2)共用体和结构体的不同:结构体类 似于一个包裹,结构体中的成员彼此是独立存在的,分布在内存的不同单元中,他们只是被打包成一个整体叫做结构体而已;共用体中的各个成员其实是一体的,彼此不独立,他们使用同一个内存单元。可以理解为:有时候是这个元素,有时候是那个元素。更准确的说法是同一个内存空间有多种解释方式。(3)共用体union就是对同一块内存中存储的二进原创 2021-05-12 14:34:10 · 284 阅读 · 0 评论 -
C语言宏
9.offsetof宏与container_of宏9.1、由结构体指针进而访问各元素的原理(1)通过结构体整体变量来访问其中各个元素,本质上是通过指针方式来访问的,形式上是通过.的方式来访问的(这时候其实是编译器帮我们自动计算了偏移量)。9.2、offsetof宏(1)offsetof宏的作用是:用宏来计算结构体中某个元素和结构体首地址的偏移量(实质是通过编译器来帮我们计算)。(2)offsetof宏的原理:我们虚拟一个type类型结构体变量,然后用type.member的方式来访问那个membe原创 2021-05-12 13:16:43 · 83 阅读 · 0 评论 -
C语言结构体
7.C语言之结构体概述7.1、结构体类型是一种自定义类型C语言中的2种类型:原生类型和自定义类型。7.2、结构体使用时先定义结构体类型再用类型定义变量(1)结构体定义时需要先定义结构体类型,然后再用类型来定义变量。(2)也可以在定义结构体类型的同时定义结构体变量。#include <stdio.h>//定义类型struct people{ char name[20]; int age;};//定义类型的同时定义变量struct student{ char na原创 2021-05-12 09:33:20 · 224 阅读 · 0 评论 -
C语言字符串
5.C语言的字符串类型5.1、C语言没有原生字符串类型(1)很多高级语言像java、C#等就有字符串类型,有个String来表示字符串,用法和int这些很像,可以String s1 = “linux”;来定义字符串类型的变量。(2)C语言没有String类型,C语言中的字符串是通过字符指针来间接实现的。5.2、C语言使用指针来管理字符串(1)C语言中定义字符串方法:char *p = “linux”;此时p就叫做字符串,但是实际上p只是一个字符指针(本质上就是一个指针变量,只是p指向了一个字符串的原创 2021-05-11 16:41:53 · 648 阅读 · 0 评论 -
C语言内存
1.程序中内存从哪里来1.1、程序执行需要内存支持对程序来说,内存就是程序的立足之地(程序是被放在内存中运行的);程序运行时需要内存来存储一些临时变量。1.2、内存管理最终是由操作系统完成的(1)内存本身在物理上是一个硬件器件,由硬件系统提供。(2)内存是由操作系统统一管理。为了内存管理方便又合理,操作系统提供了多种机制来让我们应用程序使用内存。这些机制彼此不同,各自有各自的特点,我们程序根据自己的实际情况来选择某种方式获取内存(在操作系统处登记这块内存的临时使用权限)、使用内存、释放内存(向操作转载 2021-05-11 15:58:25 · 1729 阅读 · 1 评论 -
C语言指针(二维数组)
1.二维数组1.1、二维数组的内存映像(1)一维数组在内存中是连续分布的多个内存单元组成的,而二维数组在内存中也是连续分布的多个内存单元组成的。(1)从内存角度来看,一维数组和二维数组没有本质差别。(2)二维数组int a[2][5]和一维数组int b[10]其实没有任何本质差别。我们可以把两者的同一单元的对应关系写下来。a[0][0] a[0][1] a[0][4] a[1][0] a[1][1] a[1][4] b[0] b[1] b[4] b[5]转载 2021-05-08 15:02:25 · 7237 阅读 · 0 评论 -
C语言指针(二重指针)
1.二重指针1.1、二重指针与普通一重指针的区别(1)本质上来说,二重指针和一重指针的本质都是指针变量,指针变量的本质就是变量。(2)一重指针变量和二重指针变量本身都占4字节内存空间,1.2、二重指针的本质(1)二重指针本质上也是指针变量,和普通指针的差别就是它指向的变量类型必须是个一重指针。二重指针其实也是一种数据类型,编译器在编译时会根据二重指针的数据类型来做静态类型检查,一旦发现运算时数据类型不匹配编译器就会报错。(2)C语言中如果没有二重指针行不行?其实是可以的。一重指针完全可以做二重指原创 2021-05-08 09:16:53 · 7091 阅读 · 1 评论 -
C语言指针(函数指针实战)
1、函数指针实战1.1、用函数指针调用执行函数用函数指针指向不同的函数来实现同一个调用执行不同的结果#include <stdio.h>int add(int a, int b);int sub(int a, int b);int multiply(int a, int b);int divide(int a, int b);// 定义了一个类型pFunc,这个函数指针类型指向一种特定参数列表和返回值的函数typedef int (*pFunc)(int, int);原创 2021-05-07 20:23:46 · 530 阅读 · 3 评论 -
C语言指针(指针数组和数组指针)
1.指针数组与数组指针1.1、字面意思来理解指针数组与数组指针(1)指针数组的实质是一个数组,这个数组中存储的内容全部是指针变量。(2)数组指针的实质是一个指针,这个指针指向的是一个数组。1.2、分析指针数组与数组指针的表达式(1)int *p[5]; int (*p)[5]; int *(p[5]);(2)一般规律:int *p;(p是一个指针); int p[5];(p是一个数组)总结:我们在定义一个符号时,关键在于:首先要搞清楚你定义的符号是谁(第一步:找核心);其次再来看谁跟核心最近、转载 2021-05-07 15:01:13 · 383 阅读 · 0 评论 -
C语言指针6(函数传参)
1.指针与函数传参1.1、普通变量作为函数形参(1)函数传参时,普通变量作为参数时,形参和实参名字可以相同也可以不同,实际上都是用实参来替代相对应的形参的。(2)在子函数内部,形参的值等于实参。原因是函数调用时把实参的值赋值给了形参。(3)这就是很多书上写的“传值调用”(相当于实参做右值,形参做左值)1.2、数组作为函数形参(1)函数名作为形参传参时,实际传递是不是整个数组,而是数组的首元素的首地址(也就是整个数组的首地址。因为传参时是传值,所以这两个没区别)。所以在子函数内部,传进来的数组名就转载 2021-05-07 10:07:51 · 982 阅读 · 0 评论