《第八章指针.ppt》由会员分享,可在线阅读,更多相关《第八章指针.ppt(31页珍藏版)》请在三一办公上搜索。
1、第8章 指针及其应用,本章主要内容,指针的定义和引用指针与数组字符指针和字符串,8.1 指针与指针变量,8.1.1指针的基本概念,就像同学与所住宿舍号码的关系,指针定义的一般形式为:类型标识符*指针名1,*指针名2,;,8.1.2 指针的定义,数据具有不同的类型,定义指针时也要定义该指针所指向的数据类型,int*pn;char*pch;float*pf;,指针是一种变量,在定义的同时可以赋给它初始值,称为指针的初始化。形式如下:类型标识符*指针名=初始地址值;例如,intm,n8;char c;int*pm=&m;int*pn=n;char*pc=&c;,8.1.3 指针的初始化,变量地址作初
2、值时,该变量在此之前已说明过,且类型应一致。可用已赋初值的指针去初始化其他指针变量,定义:例:int i;int*i_pointer;引用:i=3*i_pointer=3&i_pointer=3010i_pointer=2000,#include“stdio.h”main()int var;int*p_var;p_var=,“*”指针运算符,表示“指向”“&”地址运算符int n,*i_point;i_ point=&n;&(*i_ point)等效于i_ point*(&n)等效于n,8.1.4 指针运算符,应区分i_ point、*i_ point 和&i_ point三者的区别:i_ p
3、oint:是指针变量,其内容是地址量*i_ point:是指针变量的目标变量&i_ point:是指针变量本身所占据的存储地址,i=3*i_pointer=3i_pointer=2000&i_pointer=3010,8.1.5 指针的运算,与整数的加减运算、加1和减1运算、指针相减运算,在指向相同数据类型的指针之间进行,但指针可以和0进行比较,用以判断是否为空指针,必须用地址常量或变量赋值,不能是普通整数。但赋0值,表示空指针,(1)指针与整数的加、减运算,指针point加上或减去一个整数n,将相对于当前位置前移或后移n个存储单元。,int*pn;不妨设pn=0 x0000,那么pn+n=p
4、n+n*sizeof(int)=0 x0000+n*2,(2)指针加1和减1运算,指针的加1和减1运算,只是指针与整数的加减运算的特例,例如:int*pn,n,m;pn=&n;m=*pn+;/先赋值再自加,(3)指针相减运算,同类型的指针变量p1和p2相减,是指针间数据的个数,不是两指针间的字节数。例如:Type*p1,*p2那么有:p2-p1=(p2-p1)/sizeof(Type),【例】使用指针将两个整数交换顺序#include stdio.hmain()int m,n,*pm,*pn,temp;pm=,在引入指针运算后,数据交换可通过指针所指向的存储地址进行操作,m和n的值改变了吗?,
5、例:输入3个数,由大到小排序输出main()int a,b,c,*pa,*pb,*pc;scanf(%d,%d,%d,exchange(int*q1,int*q2,int*q3)if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2*q3)swap(q2,q3);,swap(int*a,int*b)int p;p=*a;*a=*b;*b=p;,8.2 指针与数组,数组名是数组在内存中的首地址,且数组的元素在内存中占用连续的一片存储空间,因此,可用指针访问数组元素,float x10,*px;/定义数组和指针px=x;或px=/指针指向数组,8.2.
6、1 指向一维数组的指针,访问数组元素方法:偏移量法,如:*(px+2)/px值不变指针移动法,如:px+/px值变化x+是不允许的,因为数组名是常量,*px就是x0,*(px+i)就是xi。xi,*(px+i),*(x+i)都是等效的,【例】使用指针对数组元素进行输入输出#include void main()float data5,*pf=data;int k;for(k=0;k5;k+)scanf(%f,pf+k);for(k=0;k5;k+)printf(%f,*pf);pf+;for(k=0;k5;k+)printf(%f,*(pf+k);,scanf(%f,pf+);区别?,pf=d
7、ata;,【例】将数组中的元素逆顺存放#includevoid main()int data7=1,2,3,4,5,6,7,temp,k,*ph,*pt;ph=data;pt=data+6;while(ptph)temp=*ph;*ph=*pt;*pt=temp;ph+;pt-;/两指针向中间移动 for(k=0;k7;k+)printf(%d,*(data+k);,指向由m个元素组成的一维数组的指针变量 例:static int a4=1,2,3,4;int(*p)4,i,j;p=a;int(*p)4表明p是一个指针变量,它指向包含4个元素的一维数组,若写成*p4,则表明是指针数组(以后再讲
8、),8.2.2 指向多维数组的指针,(1)二维数组的指针 假设有如下数组:int a34=1,3,5,7,9,11,13,1517,19,21,23,a00,a02,a12,a13,a03,a23,a20,a11,a21,a22,a10,a01,a,a+1,a+2,(2000),(2008),(2016),a0+1,第二行首地址,即a2的首地址,第一行首地址,即a1首地址,第零行首地址,即数组的首地址,a,a+1,a+2,a0:第0行第0列元素的地址,即&a00a1:第1行第零列元素的地址,即&a10a2:第2行第零列元素的地址,即&a20a0+1:第0行第1列地址是&a01a1+2:第1行第
9、2列地址是&a12,a1+2=*(a+1)+2=&a12-不能写成*(a+1+2),【例】用指针变量输出数组元素的值#include stdio.hvoid main()static int a34=1,2,3,4,5,6,7,8,9,10,11,12;int*p,i,j,n;n=sizeof(a)/sizeof(int);for(p=a0;pa0+n;p+)printf(%d,*p);,例:求成绩的平均值(二维数组做函数参数)#include“stdio.h”void average(float*p,int n)float*p_end=p+n-1,sum=0,aver;for(;p=p_en
10、d;p+)sum=sum+(*p);aver=sum/n;printf(average=%5.2fn,aver);main()static float score34=60,61,62,63,70,71,72,73,80,81,82,83;average(score,12);,在定义的同时进行初始化例如:char*p=”a string”;,8.3 字符指针和字符串,末尾自动加0,标志结束,不计入总长度,利用赋值语句初始化char*s;s=“string”;,两种初始化的方法,【例】使用指针编写程序,比较两个字符串的大小(不使用字符串处理函数)步骤:定义两个指向字符串的指针通过移动指针进行逐字
11、符比较如有字符串ABCdEF和ABCDEF,则认为ABCdEF比ABCDEF大原因:前3个字符一样,第4个字符d的ASCII值比D的ASCII值大,#include void main()char str150,str250;char*ps1=str1,*ps2=str2;scanf(%s,ps1);scanf(%s,ps2);while(*ps1!=0,【例7】使用指针编程,进行字符串复制#include void main()char a=Tsinghua University,b30;int i,j;for(i=0;*(a+i)!=0;i+)*(b+i)=*(a+i);/逐个字符复制*(
12、b+i)=0;/加截止符 printf(String a is:%sn,a);for(i=0;bi!=0;i+)printf(%c,bi);/逐个字符输出,字符指针变量与字符数组的区别,字符数组 字符指针变量,1.数组单元存放一个字符2.对字符数组赋值要用Static char str=“Tsinghua”3.对字符数组只能对各个元素赋值。不能用 char str20;str=“Tsinghua”;,1.变量中存放的是地址2.指针变量不必加staticchar*a=“Tsinghua”;3.指针变量可用:char*a;a=“tsinghua”;,4.对数组定义,编译时已分配内存单元,有确切地址5.char*format=“a=%d,b=%fn”;printf(format,a,b);但不能用:char format;format=“a=%d,b=%fn”;printf(format,a,b);,4.定义指针变量,给指针变量分配内存单元,但无确切地址,即并未指向哪一个具体的字符数据,指针变量的值可以改变。5.可用指针变量指向一个格式字符串,用以代替printf中的格式字符串,类似于宏。如:char*format;format=“a=%d,b=%fn”;printf(format,a,b);相当于 printf(“a=%d,b=%fn”a,b);,