关于堆栈和指针(指针例子解释很好)
简明x86汇编语言教程

第一章汇编语言简介先说一点和实际编程关系不太大的东西。
当然,如果你迫切的想看到更实质的内容,完全可以先跳过这一章。
那么,我想可能有一个问题对于初学汇编的人来说非常重要,那就是:汇编语言到底是什么?汇编语言是一种最接近计算机核心的编码语言。
不同于任何高级语言,汇编语言几乎可以完全和机器语言一一对应。
不错,我们可以用机器语言写程序,但现在除了没有汇编程序的那些电脑之外,直接用机器语言写超过1000条以上指令的人大概只能算作那些被我们成为“圣人”的牺牲者一类了。
毕竟,记忆一些短小的助记符、由机器去考虑那些琐碎的配位过程和检查错误,比记忆大量的随计算机而改变的十六进制代码、可能弄错而没有任何提示要强的多。
熟练的汇编语言编码员甚至可以直接从十六进制代码中读出汇编语言的大致意思。
当然,我们有更好的工具——汇编器和反汇编器。
简单地说,汇编语言就是机器语言的一种可以被人读懂的形式,只不过它更容易记忆。
至于宏汇编,则是包含了宏支持的汇编语言,这可以让你编程的时候更专注于程序本身,而不是忙于计算和重写代码。
汇编语言除了机器语言之外最接近计算机硬件的编程语言。
由于它如此的接近计算机硬件,因此,它可以最大限度地发挥计算机硬件的性能。
用汇编语言编写的程序的速度通常要比高级语言和C/C++快很多--几倍,几十倍,甚至成百上千倍。
当然,解释语言,如解释型LISP,没有采用JIT技术的Java虚机中运行的Java 等等,其程序速度更无法与汇编语言程序同日而语。
永远不要忽视汇编语言的高速。
实际的应用系统中,我们往往会用汇编彻底重写某些经常调用的部分以期获得更高的性能。
应用汇编也许不能提高你的程序的稳定性,但至少,如果你非常小心的话,它也不会降低稳定性;与此同时,它可以大大地提高程序的运行速度。
我强烈建议所有的软件产品在最后Release之前对整个代码进行Profile,并适当地用汇编取代部分高级语言代码。
至少,汇编语言的知识可以告诉你一些有用的东西,比如,你有多少个寄存器可以用。
ARM练习题

简答题什么是嵌入式操作系统?答:嵌入式系统是以应用为中心,以计算机技术为基础,软/硬件可裁减,功能。
可靠性,成本,体积,功耗要求严格的专用计算机系统。
与通用计算机相比,嵌入式系统有哪些特点?答:(1).嵌入式系统通常是面向特定应用的;(2).嵌入式系统是将计算机技术,半导体技术和电子技术与各行各业的具体应用相结合的后的产物,是一门综合技术学科;(3).嵌入式系统和具体应用有机的结合在一起,它的升级换代也是和具体产品同步进行的,因此嵌入式产品一旦进入市场,就有较长的生命周期;(4).为了提高执行速度和可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存储于磁盘等载体中;(5).嵌入式系统本身不具有自主开发能力,即使设计完成以后用户通常也不能对其中的程序功能进行修改,必须有一套开发工具和环境才能进行开发。
ARM处理器有几种寻址方式,说明各种寻址的方式。
答:立即寻址:操作数直接放在指令中。
例如:ADD R0,R0,#0x3f ;R0←R0+0x3f寄存器寻址:操作数放在寄存器中。
例如:ADD R0,R1,R2 ;R0←R1+R2寄存器间接寻址:操作数在内存,以寄存器中的值作为操作数的地址。
例如:LDR R0,[R1] ;R0←[R1]基址加偏移量寻址(基址变址寻址):基址寄存器的内容与指令中的偏移量相加形成操作数的有效地址例如:LDR R0,[R1,#4] ;R0←[R1+4]LDR R0,[R1,R2] ;R0←[R1+R2]多寄存器寻址:一条指令可以完成多个寄存器值的传送。
例如:LDMIA R0,{R1,R2,R3,R4} ;R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+12]堆栈寻址:堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
例如:STMFD R13!,{R0,R4-R12,LR}LDMFD R13!,{R0,R4-R12,PC}举例介绍嵌入式处理器有哪几类?答:1.嵌入式微处理器(Embedded Microprocessor Unit,EMPU);2.嵌入式微控制器;(Embedded Microcontroller Unit,EMCU)3.嵌入式DSP处理器(Embedded Digital Signal Processor,EDSP);4.嵌入式片上系统(Embedded System on Chip,EsoC);什么是立即数?请简要描述立即数在使用时有什么注意要点。
微机原理习题解答:4

微机原理习题解答:4习题四1.8086语言指令的寻址方式有哪几类?用哪一种寻址方式的指令执行速度最快?答:数据操作数的寻址方式有七种,分别为:立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对基址变址和相对基址变址寻址。
其中寄存器寻址的指令执行速度最快。
2.若DS=6000H,SS=5000H,ES=4000H,SI=0100H,BX=0300H,BP=0400H,D=1200H,数据段中变量名NUM的偏移地址为0050H,试指出下列源操作数的寻址方式和物理地址是多少?(1)MOV AX,[64H]答:寻址方式为直接寻址;PA=60064H(2)MOV AX,NUM 答:寻址方式为直接寻址;PA=60005H (3)MOV AX,[SI]答:寻址方式为寄存器间接寻址;PA=60100H (4)MOV AX,[BX]答:寻址方式为寄存器间接寻址;PA=60300H (5)MOV AX,[BP]答:寻址方式为寄存器间接寻址;PA=50400H (6)MOV AL,[DI]答:寻址方式为寄存器间接寻址;PA=61200H (7)MOV AL,[BX+1110H]答:寻址方式为寄存器相对寻址;PA=61410H (8)MOV AX,NUM[BX]答:寻址方式为寄存器相对寻址;PA=60305H (9)MOV AX,[BX+SI]答:寻址方式为基址变址寻址;PA=60400H(10)MOV AX,NUM[BX][DI]答:寻址方式为相对基址变址寻址;PA=61505H3.设BX=637DH,SI=2A9BH,位移量为C237H,试确定由这些寄存器和下列寻址方式产生的有效地址。
(1)直接寻址答:有效地址为EA=C237H(2)用BX的寄存器间接寻址答:有效地址为EA=637DH(3)用BX的相对寄存器间接寻址答:有效地址为EA=125B4H (4)基址加变址寻址答:有效地址为EA=8E18H(5)相对基址变址寻址答:有效地址为EA=1504FH其中,(3)和(5)中产生进位,要把最高位1舍去。
单片机原理及应用(第三版)张毅刚-课后习题答案完整版

第 1 章思考题及习题 1 参考答案一、填空1. 除了单片机这一名称之外,单片机还可称为或。
答:微控制器,嵌入式控制器.2. 单片机与普通微型计算机的不同之处在于其将、、和三部分,通过内部连接在一起,集成于一块芯片上。
答:CPU、存储器、I/O 口、总线3. AT89S52 单片机工作频率上限为MHz 。
答:33 MHz 。
4. 专用单片机已使系统结构最简化、软硬件资源利用最优化,从而大大降低和提高。
答:成本,可靠性。
二、单选1. 单片机内部数据之所以用二进制形式表示,主要是A.为了编程方便 B .受器件的物理性能限制C.为了通用性 D .为了提高运算速度答:B2. 在家用电器中使用单片机应属于微计算机的。
A .辅助设计应用B.测量、控制应用C.数值计算应用 D .数据处理应用答:B3. 下面的哪一项应用,不属于单片机的应用范围。
A .工业控制B.家用电器的控制C.数据库管理D.汽车电子设备答:C三、判断对错1. STC系列单片机是8051 内核的单片机。
对2. AT89S52 与AT89S51 相比,片内多出了4KB 的Flash 程序存储器、128B 的RAM 、1个中断源、 1 个定时器(且具有捕捉功能)。
对3. 单片机是一种CPU。
错4. AT89S52 单片机是微处理器。
错5. AT89C52 片内的Flash程序存储器可在线写入,而AT89S52 则不能。
错6. 为AT89C51 单片机设计的应用系统板,可将芯片AT89C51 直接用芯片AT89S51 替换。
对7. 为AT89S51 单片机设计的应用系统板,可将芯片AT89S51 直接用芯片AT89S52 替换。
对8. 单片机的功能侧重于测量和控制,而复杂的数字信号处理运算及高速的测控功能则是DSP的长处。
对四、简答1. 微处理器、微计算机、微处理机、CPU 、单片机、嵌入式处理器它们之间有何区别?答:微处理器、微处理机和CPU 它们都是中央处理器的不同称谓,微处理器芯片本身不是计算机。
c语言 多进程和多线程

进程是一个具有独立功能的程序关于某个数据集合的一次可以并发执行的运行活动,是处于活动状态的计算机程序。进程作为构成系统的基本细胞,不仅是系统内部独立运行的实体,而且是独立竞争资源的基本实体。
进程是资源管理的最小单位,线程是程序执行的最小单位。进程管理着资源(比如cpu、内存、文件等等),而将线程分配到某个cpu上执行。在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持多处理器系统和减小上下文切换开销。
进程的状态系统为了充分的利用资源,对进程区分了不同的状态.将进程分为新建,运行,阻塞,就绪和完成五个状态.
新建表示进程正在被创建,
运行是进程正在运行,
阻塞是进程正在等待某一个事件发生,
就绪是表示系统正在等待CPU来执行命令,
完成表示进程已经结束了系统正在回收资源.
由于UNIX系统是分时多用户系统, CPU按时间片分配给各个用户使用,而在实质上应该说CPU按时间片分配给各个进程使用,每个进程都有自己的运行环境以使得在CPU做进程切换时不会"忘记"该进程已计算了一半的"半成品”.以DOS的概念来说,进程的切换都 是一次"DOS中断"处理过程, 包括三个层次:
char *string;
说明:
本调用将参数string传递给一个命令解释器(一般为sh)执行,即string被解释为一条命令,由sh执行该命令.若参数string为一个空指针则为检查命令解释器是否存在.
该命令可以同命令行命令相同形式,但由于命令做为一个参数放在系统调用中,应注意编译时对特殊意义字符的处理.命令的查找是按PATH环境变量的定义的.命令所生成的后果一般不会对父进程造成影响.
}
pclose(fd);
2.
c语言中指针用法

1) 运算符 :*
该运算符作用在指针变量上,表示访问指针
变量所指向的数据对象编。辑课件
22
2)作用:
实现对指针所指向的数据对象的间接访问, 包括引用和赋值等基本运算。
例6-6 下面的程序段包含着对指针的间接访问。
int a,b=2,c,*p; …… p=&b; scanf("%d",&a); c=a+*p;
1.指针的赋值
操作指针之前必须赋予确定的值,可以在 定义指针的同时赋予初值,也可以用赋值表达 式对指针变量赋值。
(1)赋空值(NULL); (2)赋予某个变量的地址。 (3)将一个指针变量的值赋予另一指针变量。
例如:int grade,*p; 编辑课件
16
p=&grade;
2.指针的加减运算
1)运算符:+、-、++、-- 。
--:原地址减去一个地址单位(基类型的实际字 节数);
例如: int *iptr; …… iptr++;// iptr=iptr+1,向下移动两个字节 iptr--;// iptr=iptr-1,向上移动两个字节
下图给出指针的移动示编意辑课:件
19
3. 取地址运算
1) 运算符:& 2) 作用:获取数据对象的内存地址,如果是结 构数据对象则获取其内存首地址。
重点:
➢ 指针的概念 ➢ 指针运算; ➢ 内存操作函数和动态存储分配。
课堂时数:6—7学时 上机时数:2—3学时 课外上机时数:2—3学时
编辑课件
2
6.1 指针的概念
1. 什么叫指针
一个数据对象的内存地址称为该数据对象 的指针 。
.net中堆和栈的区别(图文解释)

尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(Garbage Collection),但是我们还是应该了解它们,以优化我们的应用程序。
同时,还需要具备一些基础的内存管理工作机制的知识,这样能够有助于解释我们日常程序编写中的变量的行为。
在本文中我将讲解栈和堆的基本知识,变量类型以及为什么一些变量能够按照它们自己的方式工作。
在.NET framework环境下,当我们的代码执行时,内存中尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(Garbage Collection),但是我们还是应该了解它们,以优化我们的应用程序。
同时,还需要具备一些基础的内存管理工作机制的知识,这样能够有助于解释我们日常程序编写中的变量的行为。
在本文中我将讲解栈和堆的基本知识,变量类型以及为什么一些变量能够按照它们自己的方式工作。
在.NET framework环境下,当我们的代码执行时,内存中有两个地方用来存储这些代码。
假如你不曾了解,那就让我来给你介绍栈(Stack)和堆(Heap)。
栈和堆都用来帮助我们运行代码的,它们驻留在机器内存中,且包含所有代码执行所需要的信息。
* 栈vs堆:有什么不同?栈负责保存我们的代码执行(或调用)路径,而堆则负责保存对象(或者说数据,接下来将谈到很多关于堆的问题)的路径。
可以将栈想象成一堆从顶向下堆叠的盒子。
当每调用一次方法时,我们将应用程序中所要发生的事情记录在栈顶的一个盒子中,而我们每次只能够使用栈顶的那个盒子。
当我们栈顶的盒子被使用完之后,或者说方法执行完毕之后,我们将抛开这个盒子然后继续使用栈顶上的新盒子。
堆的工作原理比较相似,但大多数时候堆用作保存信息而非保存执行路径,因此堆能够在任意时间被访问。
与栈相比堆没有任何访问限制,堆就像床上的旧衣服,我们并没有花时间去整理,那是因为可以随时找到一件我们需要的衣服,而栈就像储物柜里堆叠的鞋盒,我们只能从最顶层的盒子开始取,直到发现那只合适的。
DSP应用程序中C代码和汇编代码的结合

DSP应用程序中C代码和汇编代码的结合◆ CEVA公司高级编译器项目经理Eran Balaish随着DSP处理器的功能日益强大,加上编译器的优化技术不断提高,以往只利用汇编语言编写DSP应用程序的普遍做法已逐渐被淘汰。
今天,几乎所有的DSP应用程序都是由C代码和汇编代码共同构成。
对于性能是核心的关键性功能,DSP工程师继续使用高度优化的汇编代码,而其它功能则采用C语言编写,以便于维护和移植。
C代码和汇编代码的结合需要DSP工程师在工具箱中备有专用工具和方法。
众所周知,汇编代码编程的性能更好,而C代码编程的优势在于编写更为方便、快捷。
为了解释清楚原因,让我们仔细对比一下汇编代码和C代码编程的优缺点。
汇编代码编程的优势● 汇编代码能够利用处理器独有的指令和各种专用硬件资源。
另一方面,C代码则是通用性的,必须支持不同的硬件平台,因此,对C代码来说,支持专用平台代码十分困难。
● 汇编代码的编程人员通常对应用非常熟悉,并可能做出编译器难以企及的设想。
● 汇编代码编程人员可以发挥人们的创造力;而编译器再先进也只是一个自动程序而已。
汇编代码编程的缺点:● 汇编代码编程人员不得不处理耗时的机器级问题,比如寄存器分配和指令调度。
而对C代码,这些问题都可交给编译器去做。
● 汇编代码编程需要拥有关于DSP架构及其指令集的专业知识,而C编码只需要掌握广为流行的C语言即可。
● 采用汇编代码,平台之间的应用移植极其困难和耗时。
而C应用程序的移植要简单得多。
图1显示了如何利用专用硬件机制来高度优化汇编代码。
左边的C代码实现方案利用模数运算创建了循环缓冲器。
右边的是高度优化的汇编代码,利用CEVA-TeakLite-III DSP核的模数机制来创建相同的缓冲器。
只要缓冲器指针(这里是r0)更新,该模数机制就自动执行模数算法。
这种运算和指针更新发生在同一个周期内,故汇编代码比C代码有效得多,其可为模数运算产生单独的指令。
在DSP应用中选择适当的C和汇编代码混合问题在于C 代码和汇编代码之间的界限究竟在哪里,答案由分析器提供的性能分析给出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于堆栈和指针堆栈是一种执行“后进先出”算法的数据结构。
设想有一个直径不大、一端开口一端封闭的竹筒。
有若干个写有编号的小球,小球的直径比竹筒的直径略小。
现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。
所以“先进后出”就是这种结构的特点。
堆栈就是这样一种数据结构。
它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。
有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。
开始放入数据的单元叫做“栈底”。
数据一个一个地存入,这个过程叫做“压栈”。
在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。
读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减1。
这个过程叫做“弹出pop”。
如此就实现了后进先出的原则。
堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。
堆栈可以用数组存储,也可以用以后会介绍的链表存储。
下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。
栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,栈顶指针减1。
#define MAX_SIZE 100typedef int DATA_TYPE;struct stack{DATA_TYPE data[MAX_SIZE];int top;};堆栈是系统使用是临时存储区域。
它是后进先出的数据结构。
C++主要将堆栈用于函数调用。
当函数调用时,各种数据被推入堆栈顶部;函数终止后的返回地址、传递给函数的参数、函数返回的结果以及函数中声明的局部变量等等。
因此当函数A调用函数B调用函数C,堆栈是增长了,但调用完成后,堆栈又缩小了。
堆是一种长期的存储区域。
程序用C++的new操作符分配堆。
对new的调用分配所需的内存并返回指向内存的指针。
与堆栈不同,你必须通过调用new明确的分配堆内存。
你也必须通过调用C++的delete 操作符明确的释放内存,堆不会自动释放内存。
如果C++中的一个类是定义在堆栈上的,就使用"."开访问它的成员。
如果是定义在堆上的,就使用"->"指针来开访问。
但在,"->"操作符也可以用在堆栈上的类。
什么是指针?和其它变量一样,指针是基本的变量,所不同的是指针包含一个实际的数据,该数据代表一个可以找到实际信息的内存地址。
这是一个非常重要的概念。
许多程序和思想依靠指针作为他们设计的基础。
开始怎样定义一个指针呢?除了你需要在变量的名称前面加一个星号外,其它的和别的变量定义一样。
举个例子,以下代码定义了两个指针变量,它们都指向一个整数。
int* pNumberOne;int* pNumberTwo;注意到两个变量名称前的前缀‟p‟了么?这是一个惯例,用来表示这个变量是个指针。
现在,让我们将这些指针实际的指向某些东西:pNumberOne = &some_number;pNumberTwo = &some_other_number;…&‟符号应该读作”什么什么的地址”,它返回一个变量在内存中的地址,设置到左侧的变量中。
因此,在这个例子中,pNumberOne设置和some_number的地址相同,因此pNumberOne现在指向some_number。
现在,如果我们想访问some_number的地址,可以使用pNumberOne。
如果我们想通过pNumberOne 访问some_number的值,那么应该用*pNumberOne。
这个星号表示解除指针的参照,应该读作“什么什么指向的内存区域”。
到现在我们学到了什么?举个例子哟,有许多东西需要理解。
我的建议是,如果你有哪个概念没有弄清楚的话,那么,不妨再看一遍。
指针是个复杂的对象,可能需要花费一段时间来掌握它。
这儿有一个例子示范上面所将的概念。
这是用C写的,没有C++扩展。
#include <stdio.h>void main(){// 申明变量int nNumber;int *pPointer;//赋值nNumber = 15;pPointer = &nNumber;// 输出nNumber的值printf("nNumber is equal to : %d\n", nNumber);// 通过pPointer修改nNumber的值*pPointer = 25;// 证明nNumber已经被改变了// 再次打印nNumber的值printf("nNumber is equal to : %d\n", nNumber);}通读一遍,并且编译样例代码,确信你理解了它为什么这样工作。
如果你准备好了,那么继续。
一个陷阱!看看你能否发现下面这段程序的毛病:#include <stdio.h>int *pPointer;void SomeFunction();{int nNumber;nNumber = 25;//将pPointer指向nNumberpPointer = &nNumber;}void main(){SomeFunction(); //用pPointer做些事情// 为什么会失败?printf("Value of *pPointer: %d\n", *pPointer);}这段程序先调用SomeFunction函数,该函数创建一个叫做nNumber的变量,并将pPointer指向它。
那么,问题是,当函数退出时,nNumber被删除了,因为它是一个局部变量。
当程序执行到局部变量定义的程序块以外时,局部变量总是被删除了。
这就意味着,当SomeFunction函数返回到main函数时,局部变量将被删除,因此pPointer将指向原先nNumber的地址,但这个地址已经不再属于这段程序了。
如果你不理解这些,那么重新阅读一遍关于局部变量和全局变量的作用范围是明智的选择。
这个概念也是非常重要的。
那么,我们如何解决这个问题呢?答案是使用大家都知道的一个方法:动态分配。
请明白C和C++的动态分配是不同的。
既然现在大多数程序员都使用C++,那么下面这段代码就是常用的了。
动态分配动态分配可以说是指针的关键所在。
不需要通过定义变量,就可以将指针指向分配的内存。
也许这个概念看起来比较模糊,但是确实比较简单。
下面的代码示范如何为一个整数分配内存:int *pNumber;pNumber = new int;第一行申明了一个指针pNumber,第二行分配一个整数内存,并且将pNumber指向这个新内存。
下面是另一个例子,这次用一个浮点数:double *pDouble;pDouble = new double;动态分配有什么不同的呢?当函数返回或者程序运行到当前块以外时,你动态分配的内存将不会被删除。
因此,如果我们用动态分配重写上面的例子,可以看到现在能够正常工作了。
#include <stdio.h>int *pPointer;void SomeFunction(){// make pPointer point to a new integerpPointer = new int;*pPointer = 25;}void main()SomeFunction(); // make pPointer point to somethingprintf("Value of *pPointer: %d\n", *pPointer);}通读一遍,编译上面的代码,确信你已经理解它是如何工作的。
当调用SomeFunction时,分配了一些内存,并且用pPointer指向它。
这次,当函数返回时,新内存就完整无缺了。
因此pPointer仍旧指向有用的东西。
这是因为使用了动态分配。
确信你已经理解它了。
那么继续向下看,了解为什么上面的程序还会有一系列的错误。
内存分配和内存释放这里有一个问题,可能会变得十分严重,虽然它很容易补救。
这个问题就是,虽然你用动态分配可以方便的让内存完整无缺,确实不会自动删除,除非你告诉计算机,你不再需要这块内存了,否则内存将一直被分配着。
因此结果就是,如果你不告诉计算机你已经使用完这块内存,那么它将成为被浪费的空间,因为其它程序或者你的应用程序的其它部分不能使用这块内存。
最终将导致系统因为内存耗尽而崩溃。
因此这个问题相当重要。
内存使用完后释放非常容易:delete pPointer;需要做的就是这些。
但是你必须确定,你删除的是一个指向你实际分配的内存的指针,而不是其它任何垃圾。
尝试用delete已经释放的内存是危险的,并且可能导致程序崩溃。
这里再次举个例子,这次修改以后就不会有内存浪费了。
#include <stdio.h>int *pPointer;void SomeFunction(){// make pPointer point to a new integerpPointer = new int;*pPointer = 25;}void main(){SomeFunction(); // make pPointer point to somethingprintf("Value of *pPointer: %d\n", *pPointer);delete pPointer;}只有一行不同,但这行是要点。
如果你不删除内存,就会导致“内存泄漏”,内存将逐渐减少,除非应用程序重新启动,否则将不能再生。
向函数传递指针传递指针给函数非常有用,但不容易掌握。
如果我们写一个程序,传递一个数值并且给它加上5,我们也许会写出如下的程序:#include <stdio.h>void AddFive(int Number){Number = Number + 5;}void main()int nMyNumber = 18;printf("My original number is %d\n", nMyNumber);AddFive(nMyNumber);printf("My new number is %d\n", nMyNumber);}但是,程序中函数AddFive的参数Number只是变量nMyNumber的一个拷贝,而不是变量本身,因此,Number = Number + 5只是为变量的拷贝增加了5,而不是最初的在main()函数中的变量。