资源描述:
《C程序设计基础讲义7.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、程序设计语言C信息与计算科学教研室GCG@STAFF.SHU.EDU.CN第七章指针§1指针概念§2指针变量定义§3指针与一维数组§4指针与函数§5指针与二维数组§6指针与字符串§1指针概念•内存,变量,数组,地址都与其存储地址有关.inta=10,*p=&a;printf(“%x%d”,p,*p)•地址—变量数据在内存存贮位置&a•指针—存贮地址的变量p指针p变量a地址2000地址&a=2002指针变量的内存单元中存放的是一个变量的地址变量a的地址赋给指针变量p指针变量p指向变量a地址2002变量值10§1指针概念1.变量的指针变量的指针指的就是该变量的首
2、地址。2.指针变量指针变量是以指针(地址)为值的一种变量。3.指针指向变量若将变量x的地址赋值变量p,则变量p指向变量x。4.指针变量的类型指针变量类型是所指向变量的类型。不同类指针不能互相赋值。5.空指针-表示指向空、没有指向或指向结束等含义,记为NULL。NULL是一个指针常量,对应0地址,在头文件stdio.h中定义。§2指针变量定义指针变量定义的一般形式:数据类型*指针变量名;例:int*p;/*定义p是指向整型变量的指针变量*/float*y;/*定义y是指向实型变量的指针变量*/char*s;/*定义s是指向字符型变量的指针变量*/定义指针变量时
3、可以对它初始化inti;int*p=&i;printf(%d%x,i,&i);printf(%d%x%x,*p,p,&p);•取址运算符&:取出内存单元的地址例:p=&i;i的地址赋给指针p,即指针p指向了变量i。•取值运算符*:取出指针所指向变量的值例:y=*p;指针p指向变量值赋给变量y*p=x;变量x的值赋给指针指向的变量•指针定义中int*p:定义指针程序使用中y=*p:指针取值运算•赋值=inta,*b,*c;b=&a;b=c;(取得地址)关系><==inta[9];*p=a[i];*q=a[j];p==q;p>q;(比较地址)算术+-++--q-
4、p;q;p++;(求解地址)1若P=ffb6则:1)q=p+4*2=ffb6+8=ffbe(H)2)q++=ffbe+2=ffc1(地址+地址?)3)q-p=(ffbe-ffb6)/2=44)p+4==q(p=a[2];q=a[6])2若intx,y,*p=&x;则:y=*p+5;y=++*p; /*++*p相当于++(*p)*/y=*p++; /*相当于y=*p;p++*/例1指针的概念main(){intx,*p;p=&x;x=20;printf("x:%d",x);printf("*p:%d",*p);printf("&x:%x",&x);
5、printf("p:%x",p);printf("&p:%x",&p);}运行结果x:20*p:20&x:ffe0p:ffe0&p:ffe2例2分析下列程序的运行结果main(){inta=10,b=8,c,d,*p1,*p2;p1=&a;p2=&b;c=*p1+*p2;d=*p1-*p2;printf("a+b=%d",c);printf("a-b=%d",d);}结果:a+b=18a-b=2§3指针与一维数组指针p指向一维数组a[]即p=&a[0]inta[9],*p=a;(下列指向相同)p=a,*p=a[0];*p(i)=*(a+i),
6、p[i]=a[i];区别:数组a是常量,不能进行增量运算。a+i为a[i]的地址,*a就是a[0],*(a+i)就是a[i]而指针p是变量,可作增量运算p++。§3指针与一维数组§3指针与一维数组下标法与指针法表示的等价性1.数组名作为指针常量若inta[5],*p;则数组名a表示数组首地址,p=&a[0];等价于p=a;2.在指针中使用下标运算符下标运算符等同于取值运算符,即p[2]等价于*(p+2),以下4个式子等价:a[2]*(p+2)*(a+2)p[2]§3指针与一维数组例3数组排序法1数组法inti,j,a[10],x,*p=a;for(i=0;i
7、<9;I++)for(j=I+1;j<10;j++)if(a[I]8、],x,*p=a;for(i=0;i<10;i++)