C语言第8章 zz指针

C语言第8章 zz指针

ID:43706070

大小:679.50 KB

页数:68页

时间:2019-10-13

上传者:U-3714
C语言第8章 zz指针_第1页
C语言第8章 zz指针_第2页
C语言第8章 zz指针_第3页
C语言第8章 zz指针_第4页
C语言第8章 zz指针_第5页
资源描述:

《C语言第8章 zz指针》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

第8章指针 8.1.1变量的地址和指针的概念程序中:inti;floatk;内存中每个字节有一个编号-----地址ik编译或函数调用时为其分配内存单元,对变量值的存取都是通过地址进行的。这种按变量地址存取变量值的方式称为“直接访问”方式…...…...内存ik200020012002200502003内存单元的地址内存单元的内容返回 指针的概念指针的定义:一个变量的地址称为该变量的指针。指针变量的值就是一个存储单元的地址。 指针的概念…...…...2000200420062005整型变量i10变量i_pointer2001200220032000指针指针变量变量的内容变量的地址通过存放变量地址的变量去访问变量的方式称为“间接访问”方式。 指针变量的定义指针变量的定义指针变量是专门用来存放变量的地址的(即指针的)。3变量i2000i_pointer指针变量变量变量地址(指针)变量值指向地址存入指针变量指针变量同其所指向的变量之间的关系 指针变量的定义形式类型名*指针变量名1[,*指针变量名2,......];合法标识符*是说明符,表示该变量是一个指针变量,而不是‘*’运算符指针的目标变量的数据类型例int*p1,*p2;float*q;staticchar*name;注意:1、int*p1,*p2;与int*p1,p2;2、指针变量名是p1,p2,不是*p1,*p23、指针变量只能指向定义时所规定类型的变量4、指针变量定义后,变量值不确定,应用前必须先赋值指针变量的定义 指针变量的赋值指针变量的初始化方法一:通过取地址运算(&)获得地址值一个变量被定义之后,编译系统会分配一个确定的地址。例:&变量名设a,b是已定义过的变量,则&a表示变量a的地址,&b表示变量b的地址。 (1)指针变量初始化的方法,即定义指针变量同时赋初值。例:inti;int*p=&i;(2)赋值语句的方法,即先定义指针变量,再对其赋已存在的地址值。例:inta,*p;p=&a; 注意:不允许把一个具体的数赋值给指针变量。例:int*p=&i;inti;例:int*p;p=1000; 方法二:利用另一个指针变量赋值可以把一个已经赋过值的指针变量的值付给另一个指针变量,从而使这两个指针变量指向同一个变量。例:intk=1,*p,*q;q=&k;p=q; 指针变量的引用指针变量的引用:&和*运算符含义:取变量的地址单目运算符优先级:2结合性:自右向左含义:取指针所指向的变量容单目运算符优先级:2结合性:自右向左两者关系:互为逆运算 …...…...2000200420062005整型变量i10变量i_pointer2001200220032000指针变量指针变量的引用i_pointer-----指针变量,它的内容是地址量*i_pointer----指针的目标变量,它的内容是数据&i_pointer---指针变量占用内存的地址200010i_pointer*i_pointer&i_pointerii_pointer&i&(*i_pointer)i*i_pointer*(&i)i_pointer=&i=&(*i_pointer)i=*i_pointer=*(&i) 指针变量的引用例:chari,j,*p1,*p2;i='a';j='b';p1=&i;p2=&j;*p2=*p1;例:chari,j,*p1,*p2;i='a';j='b';p1=&i;p2=&j;p2=p1;比较以下两段程序,分析它们的差异? 指针变量的引用例:main(){inta,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;pointer_2=&b;printf("%d,%d ",a,b);printf("%d,%d ",*pointer_1,*pointer_2);} 指针变量的引用[例1]输入两个数,并使其从大到小输出main(){int*p1,*p2,*p,a,b;scanf("%d,%d",&a,&b);p1=&a;p2=&b;if(ap2表示p1指的元素在后p1==p2表示p1与p2指向同一元素若p1与p2不指向同一数组,比较无意义 指针变量的运算空指针#defineNULL0int*p=NULL;p指向地址为0的单元,系统保证该单元不作它用表示指针变量值没有意义注意:p=NULL与未对p赋值不同注意:未对p赋值,是不能使用的,对指着变量赋0值并不代表它指向内存0号单元,而是表示它不指向具体的变量。 指针变量做为函数参数swap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta,b;scanf("%d,%d",&a,&b);if(amain(){staticinta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int(*p)[4],i,j;p=a;printf(" Pleaseinputiandj:");scanf("%d%d",&i,&j);printf("a[%d][%d]=%d ",i,j,*(*(p+i)+j));} 二维数组的指针和指向数组的指针变量指针数组定义:数组中的元素为指针变量定义形式:数据类型*数组名[数组长度];例:int*p[4];数组元素是指针,其所指向变量的数据类型注意:p是数组名,有4个数组元素,都为指针类型,指向整型变量区分int*p[4]与int(*p)[4] 二维数组的指针和指向数组的指针变量用指针数组处理二维数组例:main(){intb[2][3],*pb[2];pb[0]=b[0];pb[1]=b[1];……..}int*pb[2]pb[0]pb[1]intb[2][3]123246b[0]为列指针,指向第0行第0列数组元素,pb[0]为指向整型的指针,可以指向数组元素,则pb[0]+1指向下一个数组元素 二维数组的指针和指向数组的指针变量小结:指向一维数组的指针变量和指针数组处理二维数组小结#defineROW7#defineCOL10intarray[ROW][COL];指向一维数组的指针变量:int(*p)[COL]=array;p是行指针,p+i指向i行*(p+i)+jp[i]+j指向第i行第j列元素指针数组:int*p[ROW]=array[0];p[i]是指向数组元素的指针,指向第i行第0列元素;p[i]+j指向第i行第j列元素 用指向变量的指针变量用指向一维数组的指针变量用二维数组名二维数组的指针和指向数组的指针变量二维数组的指针作函数参数用指向变量的指针变量用指向一维数组的指针变量用二维数组名实参形参数组名intx[][4]指针变量int(*q)[4]数组名intx[][4]指针变量int(*q)[4]数组名a数组名a指针变量p1指针变量p1若inta[3][4];int(*p1)[4]=a;int*p2=a[0];指针变量p2指针变量int*q 7.5函数指针和指向函数的指针变量函数指针:函数在编译时被分配的入口地址,用函数名表示。max…...指令1指令2存放函数指针的变量–––指向函数的指针变量。 函数指针和指向函数的指针变量指向函数的指针变量:定义形式:数据类型(*指针变量名)();函数指针变量赋值:如p=max;函数调用形式:c=max(a,b);c=(*p)(a,b);注意:函数指针变量pn,p++,p--无意义函数指针变量指向的函数必须有函数说明函数返回值的数据类型专门存放函数入口地址可指向返回值类型相同的不同函数()不能省int(*p)()与int*p()不同例:int(p)(); 函数指针和指向函数的指针变量例:求a、b中最大者函数。intmax(x,y)intx,y;{intz;z=z(x>y)?x:y;return(z);}main(){intmax();int(p)();inta,b,c;p=max;scanf("a=%d,b=%d",&a,&b);c=(p)(a,b)printf("maxvalue=%d",c) 函数指针和指向函数的指针变量注意:int(*pmax)()不要写成int*pmax()pmax=max:表示pmax和max都指向函数的开头用函数指针变量调用函数,和用函数名调用函数是一样的。调用函数的一般形式为:(*指针变量)(实参表)凡是指针变量不能进行算术运算 8.5返回指针值的函数问题引入:既然函数返回值可以是整、实型等数据。当然也可以是指针值,只是函数定义形式略有不同:类型标识符函数名(形参表列) 定义含义inti;int*p;inta[n];int*p[n];int(*p)[n];intf();int*p();int(*p)();int**p;定义整型变量ip为指向整型数据的指针变量定义含n个元素的整型数组an个指向整型数据的指针变量组成的指针数组pp为指向含n个元素的一维整型数组的指针变量f为返回整型数的函数p为返回指针的函数,该指针指向一个整型数据p为指向函数的指针变量,该函数返回整型数p为指针变量,它指向一个指向整型数据的指针变量指针的数据类型 voidfunc(int*p){intt;if(*p<*(p+1)){t=*p;*p=*(p+1);*(p+1)=t;}if(*p<*(p+2)){t=*p;*p=*(p+2);*(p+2)=t;}if(*(p+1)<*(p+2)){t=*(p+1);*(p+1)=*(p+2);*(p+2)=t;}}voidmain(){inti,a[3];for(i=0;i<3;i++)scanf("%d",&a[i]);func(a);printf("%d,%d",a[0],a[2]);}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭