计算机系统概论十六章.docVIP

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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。有时我们说指针不指向任何东西很。当我们讨论

文档评论(0)

bm5044 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档