资源描述:
《C程序设计 教学课件 作者 王丽娟 第7-12章第8章.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第八章指针8.1指针的概念与定义8.2指针作函数参数8.3指针与数组8.4指针与函数8.5复杂指针8.1指针的概念与定义8.1.1指针的概念图8.1内存分配表8.1.2指针的定义及使用1.指针的定义指针是一种存放地址值的变量,像其它变量一样,必须在使用前定义。指针变量的命名遵守与其它变量相同的规则,即必须是唯一的标识符。指针定义的格式如下:类型名*指针名;例8.1指针与非指针的定义char*pcl,*pc2;/*pcl和pc2均为指向char型的指针*/float*pf,percent;/*pf是float型的指针,而percent为普通的float型变量*/例8
2、.2指针的指向int*point;scanf("%d",point);2.指针的有关运算符两个有关的运算符:&:取地址运算符。*:指针运算符(或称“间接访问”运算符)。例如:&a为变量a的地址,*p为指针p所指向的存贮单元的内容。&运算符只能作用于变量,包括基本类型变量和数组的元素、结构体类型变量或结构体的成员(第九章),不能作用于数组名、常量或寄存器变量。例如:doubler,a[20];inti;registerintk;表达式&r、&a[0]、&a[i]是正确的,而&(2*r)、&a、&k是非法表示。单目运算符*是&的逆运算,它的操作数是对象的地址,*运算的
3、结果是对象本身。单目*称为间访运算符,“间访”就是通过变量的地址而不是变量名存取(或引用)变量。例如,如果pc是指向字符变量c的指针,则*(&c)和*pc表示同一字符对象c。因而赋值语句*(&c)=′a′;*pc=′a′;c=′a′;效果相同,都是将′a′存入变量c。例8.3取地址运算符。intvariable,*point;point=&variable;3.指针的使用例8.4指针的使用。main(){inta,b,*p1,*p2;a=10;b=20;p1=&a;p2=&b;printf("%dt%d",*p1,*p2);p1=&b;p2=&a;pri
4、ntf("%dt%d",*p1,*p2);}程序运行结果:10202010程序说明:(1)在两个printf函数调用语句中的*是指针运算符,这一单目运算符的运算对象应该是指针或地址,它的作用是得到指针指向变量的值。(2)在第一个printf函数调用时,可以假设内存的分配如图8.2所示。图8.2内存分配表(3)在第二个printf函数调用时,内存的分配将如图8.3所示。图8.3内存分配表例8.5指针的使用。main(){inta,*pi;floatf,*pf;a=10;f=20.5;pi=&a;pf=&f;printf("%dt%4.1f",a,
5、f);printf("%dt%4.1f",*pi,*pf);}程序运行结果:1020.51020.5程序说明:图8.4内存分配表8.2指针作函数参数例8.6函数参数的传递。voidswap(intx,inty);main(){inta,b;a=10;b=20;swap(a,b);printf("a=%d,b=%d",a,b);}voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}运行结果:a=10,b=20图8.5swap函数被调用时的内存分配图图8.6swap函数调用结束时的内存分配图例
6、8.7指针作函数参数。voidswap(int*x,int*y);main(){inta,b,*p1,*p2;a=10;b=20;p1=&a;p2=&b;swap(p1,p2);printf("a=%d,b=%d",a,b);/*或printf(″%d%d″,*p1,*p2)*/}voidswap(int*pa,int*pb){inttemp;temp=*pa;*pa=*pb;*pb=temp;}运行结果:a=20,b=10图8.7swap函数被调用时的内存分配图图8.8swap函数调用结束时的内存分配图例8.8指针作函数参数。voidswa
7、p(int*,int*);main(){inta,b,*p1,*p2;a=10;b=20;p1=&a;p2=&b;swap(p1,p2);printf("a=%d,b=%d",a,b);}voidswap(int*pa,int*pb){int*temp;temp=pa;pa=pb;pb=temp;}运行结果:a=10,b=20图8.9swap函数被调用时的内存分配图图8.10swap函数调用结束时的内存分配图例8.9指针作函数参数。voidswap(int