自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(112)
  • 收藏
  • 关注

转载 Linux应用编程和网络编程(1、文件IO)

一、文件操作的主要接口:API1、什么是API(1)API的实质是一些函数,这些函数是Linux系统提供支持的,由应用层程序来使用。(2)应用层程序通过调用API来调用操作系统中的各种功能,来实现功能(3)学习一个操作系统,其实就是学习使用这个操作系统的API。譬如我们要使用Linux系统来读写文件,就是学习Linux系统API中和文件IO有关的几个。注意:文件系统和驱动都是操作系统的一部分2、Linux常用文件IO接口open、close、write、read、Iseek3、文件操作的一般

2021-07-24 10:29:08 157

原创 动手安装交叉编译工具链

1、Windows中安装软件的特点Windows中装软件使用安装包,安装包解压后有两种情况:一种是一个安装文件(.exe.msi),双击进行安装,下一步指导安装完毕。安装完毕后会在桌面上生成快捷方式,我们平时使用快捷方式来启动这些程序;另一种是所谓的绿色软件、免安装软件,这种不需要安装,直接解压点击exe文件即可执行2、Linux中安装软件的特点1:在线安装。譬如Ubuntu中使用apt-get install vim来安装vim软件2:自己下载安装包来安装。这种方式的缺陷是不知道下载的安装包和

2021-06-16 19:07:12 734

原创 Makefile简单介绍

1、为什么要使用Makefile(1)工程项目中c文件太多管理不方便,因此用Makefile来做项目管理,方便编译链接过程。(2)uboot和linux kernel本质上都是C语言的项目,都由很多个文件组成,因此都需要通过Makefile来管理。所以要分析uboot必须对Makefile有所了解。2、简单的Makefile实例exe: gcc a.c -o exe//执行a.c的时候,直接在命令行输入make即可3、Makefile中的一些基本概念目标:目标顶格写,后面是冒号(冒号后面是

2021-06-16 08:40:21 674

原创 shell循环结构等

2.1、shell介绍2.1.1、shell是操作系统的终端命令行(1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式。(2)我们可以使用shell和操作系统、uboot等软件系统进行交互。具体来说就是我们通过shell给软件系统输入命令然后回车执行,执行完成后又会回到shell命令行可以再次输入命令执行。(3)上述的操作方式一般情况下工作很好,但是有缺陷。譬如我们要在linux下创建一个文件a.c,可以touch a.c 但是如果我现在是用在linux下创建1

2021-06-15 19:34:14 285

转载 uboot和系统移植3(环境变量和Flash及DDR管理)

1.10、uboot的常用环境变量11.10.1、环境变量如何参与程序运行(1)环境变量有2份,一份在Flash中,另一份在DDR中。uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中都是用DDR中这一份,用户可以用saveenv指令将DDR中的环境变量重新写入Flash中去更新Flash中环境变量。下次开机时又会从Flash中再读一次。(2)环境变量在uboot中是用字符串表示的,也就是说uboot是按照字符匹配的方式来区分各个环境变量的。因此用的时

2021-06-15 09:27:46 552

原创 uboot和系统移植2(uboot常用命令)

1.5、uboot的常用命令11.5.1、类似linux终端的行缓冲命令行(1)行缓冲的意思就是:当我们向终端命令行输入命令的时候,这些命令没有立即被系统识别,而是被缓冲到一个缓存区(也就是系统认为我们还没有输入完),当我们按下回车键(换行)后系统就认为我们输入完了,然后将缓冲区中所有刚才输入的作为命令拿去分析处理。(2)linux终端设计有3种缓冲机制:无缓冲、行缓冲、全缓冲1.5.2、有些命令有简化的别名(1)譬如printenv命令可以简化为print,譬如setenv可以简化为set1.

2021-06-14 19:47:12 284

转载 uboot和系统移植1(uboot简介)

2.1.1.为什么要有uboot1.1、计算机系统的主要部件(1)计算机系统就是有CPU来做核心进行运行的系统。典型的计算机系统有:PC机(台式机+笔记本)、嵌入式设备(手机、平板电脑、游戏机)、单片机(家用电器像电饭锅、空调)(2)计算机系统的组成部件非常多,不同的计算机系统组成部件也不同。但是所有的计算机系统运行时需要的主要核心部件都是3个东西:CPU + 外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM/SRAM)1.1.2、PC机的启动过程(1)典型的PC机的

2021-06-14 19:43:56 421

原创 C语言链表8(状态机和多线程)

8.、什么是状态机8.1、有限状态机(1)常说的状态机是有限状态机FSM。FSM指的是有有限个状态(一般是一个状态变量的值),这个机器同时能够从外部接收信号和信息输入,机器在接收到外部输入的信号后会综合考虑当前自己的状态和用户输入的信息,然后机器做出动作:跳转到另一个状态。(2)考虑状态机的关键点:当前状态、外部输入、下一个状态8.2、两种状态机:Moore型和Mealy型(1)Moore型状态机特点是:输出只与当前状态有关(与输入信号无关)。相对简单,考虑状态机的下一个状态时只需要考虑它的当前状

2021-06-13 12:37:14 769 1

原创 C语言链表7

7、linux内核链表7.1、前述链表数据区域的局限性(1)之前定义数据区域时直接int data;我们认为我们的链表中需要存储的是一个int类型的数。但是实际上现实编程中链接中的节点不可能这么简单,而是多种多样的。(2)一般实际项目中的链表,节点中存储的数据其实是一个结构体,这个结构体中包含若干的成员,这些成员加起来构成了我们的节点数据区域。7.2、一般性解决思路:数据区封装为一个结构体(1)因为链表实际解决的问题是多种多样的,所以内部数据区域的结构体构成也是多种多样的。这样也导致了不同程序当中

2021-06-11 09:38:43 190 1

原创 C语言链表6

6、双链表的算法之遍历节点(1)双链表是单链表的一个父集。双链表中如何完全无视pPrev指针,则双链表就变成了单链表。这就决定了双链表的正向遍历(后向遍历)和单链表是完全相同的。(2)双链表中因为多了pPrev指针,因此双链表还可以前向遍历(从链表的尾节点向前面依次遍历直到头节点)。但是前向遍历的意义并不大,主要是因为很少有当前当了尾节点需要前向遍历的情况。(3)总结:双链表是对单链表的一种有成本的扩展,但是这个扩展在有些时候意义不大,在另一些时候意义就比较大。因此在实践用途中要根据业务要求选择适合的

2021-06-09 16:00:08 141

原创 C语言链表5

5、双链表的引入和基本实现5.1、单链表的局限性(1)单链表是对数组的一个扩展,解决了数组的大小比较死板不容易扩展的问题。使用堆内存来存储数据,将数据分散到各个节点之间,其各个节点在内存中可以不相连,节点之间通过指针进行单向链接。链表中的各个节点内存不相连,有利于利用碎片化的内存。(2)单链表各个节点之间只由一个指针单向链接,这样实现有一些局限性。局限性主要体现在单链表只能经由指针单向移动(一旦指针移动过某个节点就无法再回来,如果要再次操作这个节点除非从头指针开始再次遍历一次),因此单链表的某些操作就

2021-06-08 16:01:40 144

原创 C语言链表4

4、单链表的算法之逆序4.1、什么是链表的逆序(1)链表的逆序又叫反向,意思就是把链表中所有的有效节点在链表中的顺序给反过来。4.2、单链表逆序算法分析(1)当我们对一个数据结构进行一个操作时,我们就需要一套算法。这就是数据结构和算法的关系。(2)我总结:算法有2个层次。第一个层次是数学和逻辑上的算法;第二次个层次是用编程语言来实现算法。(3)从逻辑上来讲,链表的逆序有很多种方法。这些方法都能实现最终的需要,但是效率是不一样的。彼此的可扩展性、容错性等不同。(4)思路:首先遍历原链表,然后将原

2021-06-08 09:15:24 138

原创 C语言链表3

3、单链表的算法之遍历节点3.1、什么是遍历(1)遍历就是把单链表中的各个节点挨个拿出来,就叫遍历。(2)遍历的要点:一是不能遗漏、二是不能重复、追求效率。3.2、如何遍历单链表(1)分析一个数据结构如何遍历,关键是分析这个数据结构本身的特点。然后根据本身特点来制定它的遍历算法。(2)单链表的特点就是由很多个节点组成,头指针+头节点为整个链表的起始,最后一个节点的特征是它内部的pNext指针值为NULL。从起始到结尾中间由各个节点内部的pNext指针来挂接。由起始到结尾的路径有且只有一条。单链表

2021-06-03 21:25:31 157

转载 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 135

原创 C语言链表1

1、链表的引入1.1、数组的缺陷(1)数组有两个缺陷:一个数组中所有的元素类型必须一致;数组中的元素个数必须事先制定并且一旦制定之后不能更改(2)数组缺陷的解决方法:第一个缺陷靠结构体去解决,结构体允许的元素的类型不相同。(3)数组缺陷的解决方法:第二个缺陷制作链表,因为链表实际上就是一个元素个数可变的数组。1.2、链表是怎样的(1)链表就是用锁链连接起来的表。这里的表指的是一个一个的节点,节点中有一些内存可以用来存储数据;这里的锁链指的是链接各个表的方法,C语言中用来连接2个表的方法就是指针。

2021-06-01 07:59:06 226

原创 C语言作用域、生长周期、链接属性

1、作用域详解1.1、局部变量的代码块作用域(1)代码块基本可以理解为一对大括号{}括起来的部分。(1)代码块不等于函数,因为if while for都有{}。所以代码块<=函数(3)局部变量的作用域是代码块作用域,也就是说一个局部变量可以被访问和使用的范围仅限于定义这个局部变量的代码块中定义式之后的部分。2、函数名和全局变量的文件作用域(1)文件作用域的意思就是全局的访问权限,也就是说整个.c文件中都可以访问这些东西。这就是平时所说的局部和全局,全局就是文件作用域。(2)详细准确地说就

2021-05-28 15:13:55 249

原创 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 736

原创 电子通信(串口通信)

1、同步通信和异步通信1.1、同步通信和异步通信的概念:同步通信其实就是指的是发送方和接收方按照同一时钟节拍工作;异步通信指的就是发送方和接收方没有统一的时钟节拍,而按照自己的节拍工作。1.2、同步通信和异步通信的优缺点:同步通信效率高,异步通信效率低同步通信复杂,双方时钟允许误差较小;异步通信简单,双方时钟可允许一定误差。同步通信用于点对多点,异步通信只适用于点对点2、电平信号和差分信号2.1电平信号和差分信号的概念电平信号和差分信号是用来描述通信线路传输方式的,也就是说如何在通信线路

2021-05-21 13:54:02 1948

原创 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 437

原创 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 187

原创 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 757 2

原创 C语言(函数库)

4.函数库4.1、什么是函数库?(1)函数库就是一些事先写好的函数的集合,给别人复用。(2)函数是模块化的,因此可以被复用。我们写好了一个函数,可以被反复使用。也可以A写好了一个函数然后共享出来,当B有相同的需求时就不需自己写直接用A写好的这个函数即可。4.2、函数库的由来(1)最开始是没有函数库,每个人写程序都要从零开始自己写。时间长了慢慢的早期的程序员就积累下来了一些有用的函数。(2)早期的程序员经常参加行业聚会,在聚会上大家互相交换各自的函数库。(3)后来程序员中的一些大神就提出把大家各

2021-05-13 20:32:02 1985 1

原创 Leetcode第一题:两数之和

题目:给定一个整数数组 nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]解题思路:暴力法:遍历数组每个元素,利用双重循环遍历当前值和另一个当前值与目标值target比较是否相等,如果相等则返回结果。代

2021-05-13 15:05:02 185

原创 C语言(函数)

3.函数的本质3.1、C语言为什么会有函数(1)整个程序分成多个源文件,一个文件分成多个函数,一个函数分成多个语句,这就是整个程序的组织形式。这样组织的好处在于:分化问题、便于编写程序、便于分工。(2)函数的出现是人(程序员和架构师)的需要,而不是机器(编译器、CPU)的需要。(3)函数的目的就是实现模块化编程。说白了就是为了提供程序的可移植性。3.2、函数书写的一般原则:第一:遵循一定格式。函数的返回类型、函数名、参数列表等。第二:一个函数只做一件事:函数不能太长也不宜太短,原则是一个函数只

2021-05-13 15:00:54 369

转载 C语言(宏定义)

2.宏定义2.1、宏定义的规则和使用解析(1)宏定义的解析规则就是:在预处理阶段由预处理器进行替换,这个替换是原封不动的替换。(2)宏定义替换会递归进行,直到替换出来的值本身不再是一个宏为止。(3)一个正确的宏定义式子本身分为3部分:第一部分是#dedine ,第二部分是宏名 ,剩下的所有为第三部分。(4)宏可以带参数,称为带参宏。带参宏的使用和带参函数非常像,但是使用上有一些差异。在定义带参宏时,每一个参数在宏体中引用时都必须加括号,最后整体再加括号,括号缺一不可。宏定义示例1:MAX宏,求2

2021-05-13 14:53:15 1602

原创 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 184

转载 C语言(枚举)

12.枚举12.1、枚举是用来干嘛的?(1)枚举在C语言中其实是一些符号常量集。直白点说:枚举定义了一些符号,这些符号的本质就是int类型的常量,每个符号和一个常量绑定。这个符号就表示一个自定义的一个识别码,编译器对枚举的认知就是符号常量所绑定的那个int类型的数字。(2)枚举中的枚举值都是常量,怎么验证?(3)枚举符号常量和其对应的常量数字相对来说,数字不重要,符号才重要。符号对应的数字只要彼此不相同即可,没有别的要求。所以一般情况下我们都不明确指定这个符号所对应的数字,而让编译器自动分配。(编译

2021-05-13 09:42:14 200

转载 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 911

原创 C语言共用体union

10.共用体union10.1、共用体类型的定义、变量定义和使用(1)共用体union和结构体struct在类型定义、变量定义、使用方法上很相似。(2)共用体和结构体的不同:结构体类 似于一个包裹,结构体中的成员彼此是独立存在的,分布在内存的不同单元中,他们只是被打包成一个整体叫做结构体而已;共用体中的各个成员其实是一体的,彼此不独立,他们使用同一个内存单元。可以理解为:有时候是这个元素,有时候是那个元素。更准确的说法是同一个内存空间有多种解释方式。(3)共用体union就是对同一块内存中存储的二进

2021-05-12 14:34:10 334

原创 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 151

原创 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 283

原创 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 724

转载 C语言内存

1.程序中内存从哪里来1.1、程序执行需要内存支持对程序来说,内存就是程序的立足之地(程序是被放在内存中运行的);程序运行时需要内存来存储一些临时变量。1.2、内存管理最终是由操作系统完成的(1)内存本身在物理上是一个硬件器件,由硬件系统提供。(2)内存是由操作系统统一管理。为了内存管理方便又合理,操作系统提供了多种机制来让我们应用程序使用内存。这些机制彼此不同,各自有各自的特点,我们程序根据自己的实际情况来选择某种方式获取内存(在操作系统处登记这块内存的临时使用权限)、使用内存、释放内存(向操作

2021-05-11 15:58:25 1870 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 7456

原创 C语言指针(二重指针)

1.二重指针1.1、二重指针与普通一重指针的区别(1)本质上来说,二重指针和一重指针的本质都是指针变量,指针变量的本质就是变量。(2)一重指针变量和二重指针变量本身都占4字节内存空间,1.2、二重指针的本质(1)二重指针本质上也是指针变量,和普通指针的差别就是它指向的变量类型必须是个一重指针。二重指针其实也是一种数据类型,编译器在编译时会根据二重指针的数据类型来做静态类型检查,一旦发现运算时数据类型不匹配编译器就会报错。(2)C语言中如果没有二重指针行不行?其实是可以的。一重指针完全可以做二重指

2021-05-08 09:16:53 8492 2

原创 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 692 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 464

转载 C语言指针6(函数传参)

1.指针与函数传参1.1、普通变量作为函数形参(1)函数传参时,普通变量作为参数时,形参和实参名字可以相同也可以不同,实际上都是用实参来替代相对应的形参的。(2)在子函数内部,形参的值等于实参。原因是函数调用时把实参的值赋值给了形参。(3)这就是很多书上写的“传值调用”(相当于实参做右值,形参做左值)1.2、数组作为函数形参(1)函数名作为形参传参时,实际传递是不是整个数组,而是数组的首元素的首地址(也就是整个数组的首地址。因为传参时是传值,所以这两个没区别)。所以在子函数内部,传进来的数组名就

2021-05-07 10:07:51 1112

转载 C语言指针 (sizeof运算符)

1.指针、数组与sizeof运算符(1)sizeof是C语言的一个运算符(主要sizeof不是函数,虽然用法很像函数),sizeof的作用是用来返回()里面的变量或者数据类型占用的内存字节数。/* char str[] = "hello"; printf("sizeof(str) = %d.\n", sizeof(str)); // 6(元素所占字节数) printf("sizeof(str[0]) = %d.\n", sizeof(str[0])); // 1(数组里面第0个元素,c

2021-05-06 16:39:27 3444 1

转载 C语言指针4(数据类型转换)

1.指针与强制类型转换1.1、变量的数据类型的含义(1)所有的类型的数据存储在内存中,都是按照二进制格式存储的。所以内存中只知道有0和1,不知道是int的、还是float的还是其他类型。(2)int、char、short等属于整型,他们的存储方式(数转换成二进制往内存中放的方式)是相同的,只是内存格子大小不同(所以这几种整形就彼此叫二进制兼容格式);而float和double的存储方式彼此不同,和整型更不同。(3)int a = 5;时,编译器给a分配4字节空间,并且将5按照int类型的存储方式转成

2021-05-06 14:33:37 1369 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除