C语言教程课件第七章 指针

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第7章指针7.1指针的概念7.2指针变量7.3函数间传递地址值7.1概念1.数据在内存中的存储方式:按数据类型给在内存为其分配一定数量的存储单元(字节)。2.内存单元的地址:内存单元的编号,与变量名对应。3.内存单元的内容:即变量的值。例如有定义:inta;charc;floatx;变量a,c,x的内存分配情况:axc4.变量的“直接访问”方式:按变量的地址(即变量名)存取变量值的方式。(见下图)i20003直接访问:3i20002000pointer间接访问方式示意图:将变量的地址放在另一个内存单元中,先到另一个内存单元中取得变量的地址,再由变量的地址找到变量并进行数据存取(见下图)。5.变量的“间接访问”方式内存用户数据区示意图:变量pointer为指针变量,存放的是变量i的内存地址,我们说pointer指向i。369.....2000...变量i变量j变量k变量pointer3010200020042008变量的值用10进制示意内存地址6.指针的概念:一个变量的地址称为该变量的指针。8.2指针与变量一.指针变量的定义和指针变量的基类型1.定义方式:类型标识符*指针变量名;float*p1;(定义了p1为指向实型变量的指针变量)char*p2;(定义了p2为指向字符型变量的指针变量)标识符前面的“*”,表示该变量为指针变量。但指针变量名是*后面的名字(不包括“*”)。该指针所指向变量的类型成为指针变量的基类型。3.说明2.指针变量的三要素:指针变量的基类型:和其所指变量的类型一致;指针变量的值:另一个变量在内存的地址;指针变量的名字:起法同普通变量。指针变量名=某一地址;二.指针变量的赋值方式1:指针变量名=&变量名;方式2:指针变量名=另一已经赋值的指针变量;方式3:通过调用库函数malloc和calloc在内存中开辟动态存储单元;方式4:还可以给指针变量赋NULL值。i的地址pi的值iqi的地址例如:inti,*p,*q,*r,*t;p=&i;/*方式1*/q=p;/*方式2*/r=malloc(4);t=NULL;示意图三.指针的运算1.移动指针对指针变量加上或减去一个整数、或通过赋值运算,使指针指向相邻的存储单元在p++中,1不代表一个字节,而是一个存储单元,具体字节数由指针的基类型决定2.指针的比较和相减相减得一整数,代表两指针所指存储单元之间相距的单元数,不是字节数。3.两个运算符*:求其后内存地址中的内容&:求变量的内存地址.[例]main(){inta,b;int*p1,*p2;a=100;b=10;p1=&a;p2=&b;printf(%d,%d\n,a,b);printf(%d,%d\n,*p1,*p2);}程序运行结果:100,10100,10再例:由下列图(a)形式,&aP1&bP2ab图(a)图(b)执行语句:p2=&*p1后,变为图(b)形式。这时:*p1为a,*p2为a,p1=p2=&a&ap1&ap2ab思考:1.若已执行了“p1=&a”,则:“&*p1”的含意是什么?2.*&a的含意是什么?3.(*p1)++相当于什么?[例]对输入的两个整数按大小顺序输出main(){int*p1,*p2,*p,a,b;a=5;b=9;p1=&a;p2=&b;①&a59p1p2&bab(1初始)2执行p=p1后&a5p1a&b9p2b&apif(ab){p=p1;②p1=p2;③p2=p;}④printf(a=%d,b=%d\n,a,b);printf(max=%d,min=%d\n,*p1,*p2);}&b&b3执行p2=p1后&ap9p1p25ab4执行p2=p后5&a&b&a9pp1p2ab------指向指针变量的指针.定义形式:类型**变量名;例如:inti,*p,**q;i=30;p=&i;q=&p;100020001000100120003000ipq内存示意图:四.指针的指针7.3函数之间传递地址值看下面的程序intsum(inta,intb){returna+b;}voidadd1(inta,intb,intc){c=a+b;}voidadd2(inta,intb,int*c){*c=a+b;}voidmain(){intx=3,y=4,z=5;z=sum(x,y);printf(“sum:z=%d\n”,z);x=3,y=4,z=5;add1(x,y,z);printf(“add1:z=%d\n”,z);x=3,y=4,z=5;add2(x,y,&z);printf(“add2:z=%d\n”,z);}考虑函数调用时,三个函数的参数传递情况内存中变量的值的变化情况voidswap1(inta,intb){intt;t=a;a=b;b=t;}voidswap2(int*a,int*b){intt;t=*a;*a=*b;*b=t;}voidmain(){intx=3,y=4;swap1(x,y);printf(“1:x=%d,y=%d”,x,y);swap2(&x,&y);printf(“2:x=%d,y=%d\n”,x,y);}再看下面的程序(同上例)函数传递参数的形式传值和传(地)址相同点:形参之间都是单向值传递,函数调用结束后,所有的形参变量都被系统收回不同点:传值时,形参变量的值不变传址时,形参为指针,其对应的变量的值会发生改变

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功