《地址和指针》PPT课件.ppt_第1页
《地址和指针》PPT课件.ppt_第2页
《地址和指针》PPT课件.ppt_第3页
《地址和指针》PPT课件.ppt_第4页
《地址和指针》PPT课件.ppt_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、第七章地址和指针,主要内容 地址和指针的概念 指针变量的定义 给指针变量赋值 对指针变量的操作 指针在函数方面的应用,7.1 地址和指针的概念,7.1.1地址和指针的概念 1.“地址”的概念 在计算机里每一个存储数据的存储单元也都必须具有一个唯一的“地址”,以示区别不同存储单元的位置。 “地址”是用于确定对象的位置,存储的数据是反映具体的内容。 2.存储单元“地址”的表示 在计算机中存储数据的存储单元,是根据存储数据类型的不同而不同。 int a; a占2个单元分别为1012,1013 float b;b占4个单元,10141017 char c ;c占1个单元,1018,a,b,c,XXXX

2、X XXXXX,XXXXX XXXXX,XXXXX XXXXX,XXXXX,3.“指针”的概念 在计算机中用户获取某一地址存储单元内的数据有两个方式: 第一种方式是直接访问:根据变量名,直接获取变量存储单元中的数据。 如:printf(“%d”,a); 第二种方式是间接访问:知道存储单元的“地址”,再根据已知地址获取存储单元中的数据 指针变量:用于存储其他变量的地址的变量。只能存储地址,不能存储普通数据,1012,1012,变量a,1012 1013,指针变量p,2002,指针变量p,2002,7.1.2为什么使用指针 例7.1欲想调用fun函数,计算出两个数相加和相减的值,然后在main函数

3、中显示结果。 fun(int x,int y) int add=0,sub=0; add=x+y; sub=x-y; main() int a,b,add=0,sub=0; scanf(“%d%d”,例7.2 fun(int x,int y,int *padd,int *psub) *padd=x+y; *psub=x-y; main() int a,b,add=0,sub=0; scanf(“%d%d”,通过指针可以非常方便地实现在调用函数时修改或传回多个数值,8,5,原值0新值13,原值0新值3,main 函数 a,b,add,sub,变量add的地址是1001,变量sub的地址是1001

4、,8,5,1001,2001,Fun函数x,y,指针变量 padd,指针变量 psub,调用fun函数时,0,13,1001,add,调用前,调用后,1001,7.2指针变量的定义和指针变量的基类型,7.2.1指针变量的定义和指针变量的基类型 定义指针变量的一般形式如下: 类型名指针变量名1,指针变量名2,.; “*”说明符用来说明所定义的变量是指针变量。 例如:int *pi,*pj;说明了pi和pj是两个指向整型变量的指针,也就是说变量pi和pj中只能存放int类型变量的地址。这时称int是指针变量pi和pj的基类型。 double *pd; 定义了一个指向双精度类型变量的指针。 char

5、 *s1,s2;定义了一个指向字符型变量的指针和一个字符变量 int *p;定义了一个指向指针的指针变量p。该指针变量p只能存放基类型为int类型的指针变量的地址,2000,1010,5,1010,a,q,2000,2050,p,7.2.2 指针变量的基类型的作用 在C语言中,不同的数据类型变量系统为它们开辟的存储空间的字节数是不同的。int类型的数据存储空间是2个字节, float类型的数据存储空间是4个字节, char类型的数据存储空间是1个字节。 系统表示每一个存储空间的地址时,是取该存储空间的第1个字节的地址作为该变量存储空间的地址。根据指针变量p中存放的“地址”,只能寻找到变量a第1

6、个字节的存储空间,它并不是变量a的原值,因为变量a原值是通过2个字节来数据。 例int *p; p,1012,变量a,1012 1013,指针变量p,2002,7.3给指针变量赋值,7.3.1使指针指向一个对象 1.通过求地址运算符()把一个变量的地址赋给指针变量 “”是求地址运算符,该运算符为单目运算符,用于求变量的地址,且该变量必须为内存变量。 例如:int k=1,j=2,*q1,*q2,*p; float x=4.5; q1= NULL是在stdio.h头文件中定义的预定义符,因此使用NULL时,应该在程序的前面应加上预定义命令行:#include “stdio.h,7.4 对指针变量

7、的操作,7.4.1通过指针或地址引用一个存储单元 当指针变量中存放了一个确切的地址值时,通过指针可以用“间接运算符”()来引用该地址所代表的存储单元。 1.在赋值号右边由“*”运算符和指针变量组成的表达式,代表指针所指存储单元的内容。 例如:int *p,i=10,j; p,例7.3指针指向三个变量,通过指针运算选出数值最小的那个数并打印出来。 main() int a,b,c,min,*pa,*pb,*pmin; pa=,7.4.2指针(变量)的运算 1.指针的移动 指针的移动就是指当指针指向一串连续的存储单元时,对指针变量加上或减去一个整数时,结果是指针了邻近的存储单元,使指针变量中存放的

8、地址值发生了变化。 当对指针变量加、减一个整数时,数字1、2并不代表1个字节,2个字节,而是代表1个存储单元,2个存储单元。 除此之外,不允许对指针进行乘、除,也不允许对两个指针加法运算,也不允许对指针加、减一个实型的常量。 2.指针的比较 比较两个指针实质上是比较两个指针变量中存放的地址值的大小。 当多个指针指向一串连续指向一串连续的存储单元时,指针比较才有意义,7.5指针与一维数组,利用地址和指针访问数组元素 数组名、元素地址及指针的关系 (1)数组名代表着这个数组所占连续存储空间的起始地址。数组名是一个地址常量。 (2)每个数组元素都是数组这个集合中的一分子,由于数组所占地址空间是连续的

9、,通过数组名这个首地址就可以找到数组中的所有元素;每个数组元素都可以看作是一个带下标的变量,它完全可以像普通变量一样进行求地址运算。 x+1等价于是非法,因为a是常量,通过数组首地址访问数组元素 int x10,i x+0 等价于 表示数组x中的元素可以有以下四种形式: xi *(x+i) *(p+i) pi,7.6 指针与二维数组,二维数组与一维数组及指针的关系 1.二维数组是由一维数组嵌套组成的 2.二维数组名和一维数组名是基类型不同的地址常量 int a34,*p a是二维数组的首地址;a0是第0行元素的首地址; 指针变量pr是一个行指针,它可以指向包含4个整型元素的一维数组,通过地址引

10、用二维数组元素 int a34,i,j; 通过地址引用二维数组元素的常见形式有: (1)*(ai+j) (2)*(*(a+i)+j) (3)(*(a+i)j 通过指针数组引用二维数组元素 int a34,*pa3,i; pa前面带有*号,说明数组中的每个元素都是基类型为整型的指针。所以pa为指针数组。 (1)paij 等价于aij (2)*(pai+j) 等价于*(ai+j) (3)*(*(pa+i)+j) 等价于*(*(a+i)+j) (4)(*(pa+i)j 等价于(*(a+i)j,7.7动态存储分配,动态存储分配的函数提供用户选用。 void *malloc(unsigned int k

11、)动态分配存储空间大小为k个字节并返回首字节地址。 例:int *pn=malloc(sizeof(int); void *calloc(unsigned int n,unsigned int k)动态分配存储空间大小为n*k个字节并返回首字节地址。 例:int *pa=calloc(10,sizeof(double); void realloc(void *ptr,unsigned int k)动态分配存储空间大小为k个字节并返回首字节址,同时把ptr把指向的动态存储空间的内容复制到新分配的动态存储空间,该函数调用的返回值通常也赋给ptr所对应的实参指针。 例:pa=realloc(pa,20*sizeof(double); 动态释放函数 void free(void *ptr)把ptr所指向的动态存储空间释放掉。 例:free(pa) 这些函数在stdlib.h头文件中,P152例51 #include “std

温馨提示

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

最新文档

评论

0/150

提交评论