参考教案学习10-pointers_第1页
参考教案学习10-pointers_第2页
参考教案学习10-pointers_第3页
参考教案学习10-pointers_第4页
参考教案学习10-pointers_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、指针提纲地址与指针简单的指针变量指针变量作为函数参数指针与数组指针与一维数组指针与字符串指针与多维数组指针与函数指针与结构体运算符小结结束地址与指针(1)内存单元的地址与内容的区别程序中处理的数据在内存中要占用一定的存储单元。要访问某个存储单元要使用该单元的内存地址。在程序中使用变量名来直接对数据进行访问。在程序中定义了一个变量,在编译时就给这个变量分配了内存单元。在不同的场合下,需要使用变量所对应的不同对象。(地址和内容)地址与指针(2)直接访问与间接访问按变量名直接存取变量值的方法称为“直接访问”。在C中,我们可以定义一种特殊的变量。这种变量的内容是其他变量所对应的内存单元地址。这样我们就

2、可以先由前一个变量的值得到后一个变量的地址,然后通过该地址取得所需要的变量值。这就是所谓的“间接访问”。地址与指针(3)指针与指针变量在“间接访问”中,我们可以使这种特殊的变量“指向”其他变量所对应的存储单元。这种指向是通过地址来体现的。所以地址被称为指针。专门用来存放其他变量地址的变量被称为指针变量。返回简单的指针变量(1)定义一个指针变量定义的一般形式:基类型 * 指针变量;这样的定义说明该变量的类型是指针类型,可以指向类型为“基类型”的变量。“基类型”是已定义的数据类型,可以是简单类型,也可以是构造类型。*既不属于基类型也不属于变量,位置可靠左、右或者两边都不靠。在定义指针变量时必须指定

3、基类型。例如 int a=10, *p; p=&a; /p指向a简单的指针变量(2)取地址运算符(&)功能:取得变量的地址。该运算符与+、-等运算符的优先级和结合性都相同。指向运算符(*)也称“间接访问”或“取内容”运算符,若p为指针变量,*p就是p所指的存储单元的内容。该运算符与+、-等运算符的优先级和结合性都相同。*号的功能在不同的场合下是不同的。&和*是互逆的操作,前者表示取其所作用变量的地址,后者表示取其所作用指针所指向的变量值。因而,如果p是指针变量则&*p和p相同;*&a和a相同。示例p*p简单的指针变量(3)指针的运算指针是一种特殊的变量,其运算是有限的:赋值运算 要求类型相同,

4、级别一致 指针变量在使用前,一定要被赋以一个地址值,否则是很危险的。 例如,double d=2.5, *dp; *dp=6.8; /! 没有被赋值的指针变量dp的值是一个随机地址,把6.8存到内存中的 随机位置,很可能破坏了另一个变量,甚至修改了栈中的函数返回 地址,造成计算机死机或进入死循环。一个指针可以加减一个整数两个指针在一定条件下可以相减两个指针在一定条件下可以相比较两指针相等或不等关系用于确定它们是否指向同一对象,大小关系用于确定它们所指对象存储位置的前后关系。返回$:$dp某变量#$:$6.8指针变量作为函数参数函数的参数可以是指针类型变量。使用这种类型参数的作用是:将一个变量的

5、地址传送到另一个函数中。用指针变量做函数参数使函数体中对形参的改变可以反映到实参。但要注意这时函数调用的参数传递仍然是值传递。用指针变量作函数参数,可以从函数中带回多于一个的返回值。示例例10.2.2返回指针与一维数组(1)定义指向数组元素的指针变量:方法是定义时,使指针变量的基类型和数组的元素类型相同。数组的指针:数组的起始地址(首地址)。数组元素的指针:数组元素的地址。数组的指针和数组首元素的指针相同,即数组名代表该数组的首地址。例如,若有int a10;则a和&a0相同。数组首地址是系统编译时确定的,是一个常量。指针与一维数组(2)与指针相关的算术运算和关系运算常常用于当指针变量指向数组

6、元素时指针变量的数加运算:p=p+1表明p的值将递增到指向数组的下一个元素。自增、自减运算:(*p)+、*p+和*(+p)指针变量间的减法运算:p-q的结果是p和q之间相隔的元素数。指向前面元素的指针变量小于指向后面元素的指针变量。例10.1.3pp+1指针与一维数组(3)访问数组元素有两种方法:ai或*(a+i)。访问数组全部元素的方法:int a10;int i;int * p;for(i=0;i10;i+) aifor(i=0;i10;i+) *(a+i)for(p=a;p,使成员的引用更直观。运算符-的结合方向为从左到右,和成员运算符.具有同样的优先级。例见10.4.1返回运算符小结返

7、回运算符结合方向备注、()、.、-自左向右!、-、+、-、(类型)、*、&自右向左此处的-为负号运算符、*为指针运算符、&为取地址运算符*、/、%自左向右此处的*为乘法运算符+、-自左向右此处的-为减法运算符、=、自左向右=、!=自左向右&自左向右|自左向右? :自右向左唯一的三目运算符=、+=、-=、*=、/=、%=自右向左,自左向右高低示例:简单的指针变量例10.1.2:输入两个整数,按先大后小的顺序输出。#include void main() int *p1,*p2,*p, a, b; scanf(%d,%d, &a, &b); p1=&a; p2=&b; if(ab) p=p1; p

8、1=p2; p2=p; printf(na=%d, b=%dn, a, b); printf(max=%d, min=%dn, *p1, *p2);返回示例:指针与函数参数(1)void swap(int * p1,int * p2) int temp; temp=*p1; *p1=*p2; *p2=temp;void main() int a,b; scanf(“%d,%d”,&a,&b); swap(&a,&b); printf(n%d,%dn,a,b);传递指针的函数调用实现过程为:1、函数声明和函数定义的函数头中指明指针参数,即例中的void swap(int * p1,int * p

9、2);2、函数调用时要传递变量的地址给形参,即例中的swap(&a,&b);3、函数定义中对形参进行间接访问。示例:指针与函数参数(2)void swap(int * p1,int * p2) int *temp; temp=p1; p1=p2; p2=temp;void main() int a,b; scanf(“%d,%d”,&a,&b); swap(&a,&b); printf(n%d,%dn,a,b);返回错误示例:指针与字符串下面程序描述了字符指针的操作: #includevoid main( )char s =abc;char *ps;ps=hello;printf(“%sn”,ps);ps+;printf(“%sn”,ps);printf(“%cn”,*ps);ps=s;printf(“%sn”,ps);0000:01000000:02F8ps0000:01000000:01010000:01020000:01030000:01040000:0105hello0运行结果: hello ello e abc输出字符指针就是输出字符串。从ps所指第1个字符开始,直到遇到0结束。输出字符指针的间接引用,就是输出单个字符。*ps即串中第2个字符。返回示

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论