- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十六章 指针和数组
16.1 介绍
在这一章,我们介绍(实际上是重新介绍)两个简单但的程序概念:指针和数组。在我们写-3的汇编我们已经用了指针和数组。现在我们用语言来研究它们。指针就是变量之类的存储地址。用指针我们可以间接地这些。例如,用指针,我们可以一个改调用者的参数函数。用指针,我们可以建一些复杂的在执行过程中可以长短的数据。数组是在存储器中连续的数据。例如,在本书前半部分的-3的例子中,我们把一个字符成在存储器中连续的字符。这些连续的字符数组。为了数组中一个特定,我们需要我们要的是哪个元素我们看到的,一个a[4]这样的表达式数组中的第五个元素因为我们从开始数组第五个元素。数组用因为我们方便地处理一组数据,向量矩阵和字符都表实世界的某特定的。我们以一个经典的例子来讨论指针的。在图16.1所示的程序中,函数Swap被用来交换它的两个参数的值。函数Swap被main函数调用,它的ValueA在这个程序中的值是3ValueB的值为4。一旦Swap回main,ValueA和ValueB的值被。但是,编译执行这段代码你会发现传给Swap的两个。
我们来检查一下Swap函数行时的时栈,分析一下这到底是为什么。图16.2示的是函数完之前第25行的执行但是控制还没有回到main函数时栈的状态。注意Swap函数已经在自己的动记录中修改了参数irstValue和econdValue的值。当Swap完并将控制给main,Swap的动记录从栈中修改的丢main中的两个值交换。我们的程序出现了错误。
在C中,以值的形式函数传递被函数。C将出现在函数中的作为表达式计算,然后将表达式的值时栈中以便将们传递给被函数。Swap修改传递给它的,它必须访问函数的动记录它必须访问存储单元。Swap函数需要main中ValueA和ValueB的地址以便改它们的值。正如我们将在下面几看到的一样,指针及其相关使这些可能。16.2.1 声明指针变量一个指针变量包含了一个存的地址,比如一个变量的地址。一个指针指向了地址的变量。与指针变量的的类型。所以,比如,一个整指针指向一个整变量。声明一个指针变量我们用下面的:int *ptr;
这我们声明了一个ptr的变量,它指向一个整数。星号(*)表明是一个指针变量。C程序员经常说ptr是int。类似的,我们可以声明char *cp;
double *dp;
变量cp指向一个字符,dp指向一个双精度浮点数。指针变量的初始化其他变量如果一个指针变量声明为一个局部变量,它就不会被自动初始化。用*来声明指针变量的可能起初,但一旦我们学了,这种后的原理就会变得清楚。
地址运算符的符号是,生存储地址,必是一个变量。在下面的码序列中,指针变量ptr将指向变量object。第二个生object的存储地址。
int object;
int *ptr;
object = 4;
ptr = object;
让我们一下这个序列的LC-3代码。两个声明的变量都被分配到栈中。指针R5指向第一个被声明的局部变量,也就是这个的。
AND R0,R0,#0 ; 清空R0
ADD R0,R0,#4 ; R0 = 4
STR R0,R5,#0 ; object = 4;
ADD R0,R5,#0 ; 生成object的存储地址
STR R0,R5,#-1 ; ptr = object;
图16.3显示ptr = object;被执行以后这代码的函数的记录。为了更具体,每个存储都一个地址,我们任意xEFF0范围内选择的。指针R5指向xEFF2。object中值4,prt中object的存储地址。
间接运算符*
第二种指针运算符称为间接或者解除运算符,它的符号是*(在这里发音star)。这个运算符我们间接操作一个存储对象里的值。例如表达式*ptr指的是被指针变量ptr指向的值。回忆前的例子*ptr指的是变量object中的值。这*ptr和object可以换使用。前的C代码的例子*ptr=*ptr+1;
本质上*ptr=*ptr+1;是object=object+1;的另一种。就像我们所见过的其他类型的变量,*ptr根据它出现在的哪一边来表示不同的意思。在右边,它指的是那个中的值(这个例子中是值4)。在左边,它指明了要作修改的(这个例子中是object的地址)。让我们代码中最后一语句的LC-3代码。注意这段代码不同于假如最后C语句是object=object+1;而生的代码。指针的间接引用,编器为右边的间接生成2LDR指令,个来加载ptr中的存地址,另个来取出那个地址中的值。对左边的间接引用,编器生成条STR R1,R0,#0如果那条语句变为object=*ptr+1;编器将会生成STR? R1,R5,#0。有时我们说指针不指向任何东西很。当我们讨论
您可能关注的文档
- 计算机设备技术参数.doc
- 计算机填空.doc
- 计算机网络安装与维修.doc
- 计算机网络故障的识别和解决方法论文 网络故障的诊断.doc
- 计算机网络基础课程设计.doc
- 计算机网络技术人员_2级_鉴定要素细目表.doc
- 计算机网络维护技巧.doc
- 计算机网络应用基础期末试卷试题2.doc
- 计算机网络知识整理.doc
- 计算机网络组成.doc
- (店铺管理)山东海阳核电站关于选址问题的研究.pdf
- 桐乡国际新能源市场.pdf
- 机械设计基础知识(doc 26页).pdf
- 2023营口市公务员行测真题附答案详解【完整版】.docx
- 2023防城港市公务员行测真题附答案详解(典型题).docx
- 2023重庆市公务员行测真题附参考答案详解【巩固】.docx
- 2023达州市公务员行测及完整答案详解(名校卷).docx
- 湖北省黄冈市黄梅县育才高级中学2024-2025学年高一下学期5月月考英语试题(含答案).docx
- 黑龙江省双鸭山市联合体考试2024-2025学年高一下学期6月月考语文试题(含答案).docx
- 黑龙江省哈尔滨市第四中学校2024-2025学年高二下学期期中考试语文试题(含答案).docx
文档评论(0)