1、,31012,当访问变量时,为“直接存取(直接访问)”。我们也可以通过指针变量间接的访问该地址中原来的值。此时称为“间接存取(间接访问)”。,8.2 指针变量的定义和指针变量的基类型,定义指针变量的一般形式如下:,类型名*指针变量名;或类型名*指针变量名1,*指针变量名2,;,例如:int*pi;int*pj,*pa;,1.pi,pj,pa都是变量,不过都是指针变量,定义时在普通变量名的左边加上星号就行了。,说明:,pi,pj,pa三个指针变量的类型为整型,说明三个变量中只能存放int类型变量的地址。这时我们称int是指针变量pi,pj,pa的基类型。,如:double*pd;char*s1,
2、*s2;,pd的基类型为double类型,在指针变量pd中,只能存放double类型变量的地址。,s1和s2的基类型为char类型,在指针变量s1和s2中,只能存放char类型变量的地址。,8.3 给指针变量赋值,8.3.1 给指针变量赋地址值,例如:int k,*q,*p;,/*k为整型变量,q和p都是指针变量。*/,q,p,k,k=1;,/*给普通变量赋值*/,整型变量k只被能赋予整型值,赋值时直接赋值就可以了,而指针变量只能被赋予地址值,如下是把整型变量k的地址赋值给指针变量q。,q=,&是用来求出变量的地址。,1,&k,知识点:,由于把变量k的地址赋予了指针变量q,q中现在存放的就是变
3、量k的地址,这时可以说:q指向了变量k。,指针变量之间也可以进行赋值:p=q;,&k,当我们输出变量k,q,p时,输出的结果为;,112450521245052,8.3 给指针变量赋值,8.3.2 给指针变量赋“空”值,除了给指针变量赋地址值之外,还可以给指针变量赋一个特殊的值,该值为“空”值。,int*p;p=NULL;p=0;,注意,此时,指针变量p中不是没有值,而是有一个“空”值。,8.4 对指针变量的操作,8.4.1 通过指针来引用一个存储单元,#include main()int k,*q,*p;k=1;q=,112450521245052,输出时,变量k为1,而指针变量q和p则为变
4、量k的地址。,#include main()int k,*q,*p;q=,1,k,&k,q,&k,p,111,访问时,在指针变量前在*(间接访问运算符)则表示访问该地址中原来的值。,8.4 对指针变量的操作,8.4.1 通过指针来引用一个存储单元,假定有以下定义和语句:,int*p,i=10,j;p=,/*定义了三个变量*/*取变量i的地址赋给指针变量p*/*间接访问指针变量中的值10赋给变量j*/,p,10,i,j,10,j=i;,间接访问运算符*是一个单目运算符,必须出现在运算对象的左边。其运算对象可以是存放地址的指针变量,也可以是地址。,j=*(,j=*,扩展知识:,j=*p+1;,10
5、,j,11,j,int*p,k=0;p=,p,k,*p=100;,100,0,k=100;,*p=*p+1;,k=k+1;,101,*p+=1;或+*p;或(*p)+;,k+=1;或+k;或 k+;,若有以下定义和语句:int*p,*s,k=20;s=,p,s,20,k,8.4 对指针变量的操作,8.4.1 通过指针来引用一个存储单元,程序举例:,例8.1 用指针指向两个变量,通过指针运算选出值最小的那个数。,#include main()int a,b,min,*pa,*pb,*pmin;pa=,pa,pb,pmin,a,b,min,/*输入的值依次放入pa、pb所指存储单元中*/,scan
6、f(“%d%d”,比如输入:,41 32,41,32,a=41 b=32,min=a;,41,if(ab)min=b;,32,min=32,8.4 对指针变量的操作,8.4.2 移动指针&8.4.3 指针比较,所谓移动指针就是对指针变量加上或减去一个整数,或通过赋值运算,使指针变量指向相邻的存储单元。,假定在内存中开辟了如图所示的五个连续的、存放int类型整数的存储单元,并分别给它们取代号为:a0、a1、a2、a3、a4。这些代号所代表的存储单元中,分别有值为:11、22、33、44、55。,a0 a1 a2 a3 a4,11 22 33 44 55,例如:int*p,*q;p=,p,q=p+
7、2;q+;q-;p+;,q,q,q,p,当有:int i,j,k;i=*p;j=*q;k=q-p;,i,j,k,22 44 2,指针比较,if(pq)printf(“p points to lower memory than q.n”);else printf(“q points to lower memory than p.n”);,p points to lower memory than q.,if(p=0)printf(“p points to NULL.N”);,8.5 函数之间地址值的传递,8.5.1 形参为指针变量时实参和形参之间的数据传递,例8.2 程序举例。#include
8、int myadd(int*a,int*b)int sum;sum=*a+*b;return sum;main()int x,y,z;printf(“Enter x,y:”);scanf(“%d%d”,x,y,z,Enter x,y:,24 41,24,41,调用,传递,a,b,sum,sum=x+y;,65,退出函数,将变量sum的值作为这个函数的返回值,返回到他的调用处。此时,该函数中的变量全部释放。,65,65,24+41=65,8.5 函数之间地址值的传递,8.5.2 通过传递地址值在被调用函数中直接改变调用函数中的变量的值,例8.3 调用swap函数,交换主函数中变量x和y中的数据。
9、,第七章例7.3的重写,#include void swap(int*,int*);main()int x=30,y=20;printf(1)x=%d y=%dn,x,y);swap(,/*函数说明语句*/,x,y,(1)x=30 y=20,调用,传递,a,b,t,(2)a=30 b=20,(3)a=20 b=30,退出该函数,返回到它的调用处,该函数无返回值,因为该函数为void类型,此时该函数中的变量全部释放。,(4)x=20 y=30,t=x;x=y;y=t;,30,20,20,30,8.5 函数之间地址值的传递,8.5.2 通过传递地址值在被调用函数中直接改变调用函数中的变量的值,例8
10、.4 编写函数order(int*a,int*b),使调用函数中的第一个实参总是存放两个数中的较小的数,第二参数存放两个数中较大的数。,#include void swap(int*x1,int*x2)int t;t=*x1;*x1=*x2;*x2=t;void order(int*a,int*b)if(*a*b)swap(a,b);main()int x,y;printf(Enter x,y:);scanf(%d%d,x,y,Enter x,y:,41 24,41,24,x=41 y=24,调用,a,b,传递,if(xy)swap(a,b);,调用并传递数据,x1,x2,t=x;,24,41
11、,x=24 y=41,8.5 函数之间地址值的传递,8.5.3 函数返回地址值,#include int*fun(int*,int*);main()int*p,i,j;printf(Enter two number:scanf(%d%d,/*函数说明*/,例8.5 程序举例。,p,i,j,Enter two number:,99 101,99,101,传递,a,b,if(ij)return a;,退出该函数,返回到它的调用处,该函数的返回值是一个地址(j的地址),所以该函数是一个指针类型。退出时该函数中的变量全部释放。,i=99,j=101,*p=101,习题,一.选择题8.1 若有定义:in
12、t x,*pb;则正确的赋值表达式是A pb=程序的输出结果是A 5,2,3 B-5,-12,-7 C-5,-12,-17 D 5,-2,-7,A,B,B,习题,8.4 若有以下程序:#include main()int k=2,m=4,n=6,*pk=后,*p的值是A 20 B 30 C 21 D 318.6 若指针p已正确定义并指向如图所示存储单元,则*+p的值是A 20 B 30 C 21 D 318.7 若指针p已正确定义并指向如图所示存储单元,则+*p的值是A 20 B 30 C 21 D 31,a0 a1 a2 a3 a4,10 20 30 40 50,p,C,B,B,C,习题,8
13、.8 若有以下程序:#include void prtv(int*x)printf(%dn,+*x);main()int a=25;prtv(程序的输出结果是A 运行错误 B 100 C a的地址 D b的地址,D,B,习题,8.10 若有以下程序:#include void fun(float*a,float*b)float w;*a=*a+*a;w=*a;*a=*b;*b=w;main()float x=2.0,y=3.0,*px=程序的输出结果是A 4,3 B 2,3 C 3,4 D 3,2,8.11 若有以下程序:#include void sub(double x,double*y,double*z)*y=*y-1.0;*z=*z+x;main()double a=2.5,b=9.0,*pa,*pb;pa=程序的输出结果是A 9.000000 B 1.500000 C 8.000000 D 10.500000,C,C,习题,8.12 以下四个程序中不能对两个整型值进行交换的是A#include B#include void swap(int*p,int*q)void swap(int*p,int*q)int*t,a;int t;t=,C,习题,二.填空题8.13 以下程序段的输出结果是_.int*var,b;b=100;var=,110,7 1,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1