最全的c语言指针详解

最全的c语言指针详解

ID:24823367

大小:704.50 KB

页数:47页

时间:2018-11-15

上传者:U-5734
最全的c语言指针详解_第1页
最全的c语言指针详解_第2页
最全的c语言指针详解_第3页
最全的c语言指针详解_第4页
最全的c语言指针详解_第5页
资源描述:

《最全的c语言指针详解》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

第6章指针6.1指针定义与使用6.2指针与函数6.3指针与数组6.4指针与字符串6.5指针数组与多级指针6.6指针与动态内存分配6.7指针的深层应用 6.1指针的引出一.地址与指针1.地址与取地址运算C程序中的变量在内存中占有一个可标识的存储区,每一个存储区是由若干个字节组成,每一个字节都有自己的地址,而一个存储区的地址是指该存储区中第一个字节的地址C语言允许在程序中使用变量的地址(通过地址运算符&可得到)如:floatx;变量x的地址----&xinta[10];数组变量a的地址----数组名a 2.指针与指针变量(1)变量的访问方式①直接访问:通过变量名或地址访问变量的存储区例:scanf(“%d”,&x);x=sqrt(x);printf(“%d”,x);②间接访问:将一个变量的地址存放在另一个变量中.如将变量x的地址存放在变量p中,访问x时先找到p,再由p中存放的地址找到xpx201210101010(2)指针:一个变量的指针就是该变量的地址(指针就是地址)(3)指针变量:存放变量地址的变量,它用来指向另一个变量 二、指针变量的定义1.格式:数据类型*指针变量名;例int*p1;char*p2;2.说明:(1)在变量定义时,*号表示该变量是指针变量(注意:指针变量是p1,p2,不是*p1,*p2)(2)定义指针变量后,系统为其分配存储空间,用以存放其他变量的地址,但在对指针变量赋值前,它并没有确定的值,也不指向一个确定的变量例:intx,*p;x=5;px2012101051234注:指针变量p的值是随机值,此时p和x并无关联 (3)使指针变量指向一个确定的变量必须进行赋值intx,*p;x=5;p=&x;px2012101051010三、指针变量的引用1.指针运算符*(1)p与*p不同,p是指针变量,p的值是p所指向的变量的地址*p是p所指向的变量,*p的值是p所指向的变量的值*p的值为5(*p表示x),而p的值为1010(2)引用指针变量时的*与定义指针变量时的*不同定义变量时的*只是表示其后的变量是指针变量 inta,*p;p=&a;scanf(“%d”,p);printf(“%d ”,*p);*p=12;printf(“%d ”,*p);pa201210105101012让p指向a对a重新赋值等价于a=12即&a2.&与*p=&a;*&a*(&a)*pa&*p&(*p)&a 2abcd53.*与++,--inta=2,b=5,c,d,*p;p的值为a的地址,*p的值为2p的值不变,*p的值为3(2)c=*p++;c=*(p++);{c=*p;p++;}执行后c的值为3,*p的值为5(3)d=*++p;d=*(++p);{++p;d=*p;}执行后d的值为3,*p的值为3p201210101010(1)p=&a;(*p)++;(等价于a++;)10123310143 例6.2#includevoidmain(){int*p1,*p2,*p,a,b;scanf(“%d%d”,&a,&b);p1=&a;p2=&b;if(avoidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}voidmain(){inta,b;scanf(“%d%d”,&a,&b);if(avoidswap1(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}voidmain(){inta,b,*pt1,*pt2;scanf(“%d%d”,&a,&b);pt1=&a;pt2=&b;if(avoidswap2(int*p1,int*p2){int*temp;*temp=*p1;*p1=*p2;*p2=*temp;}说明:这种方法可能会破坏系统的正常工作状态,因为temp是一个指针变量但是在函数中并没有给temp一个确定的地址,这样它所指向的内存单元是不可预见的,而对*temp的赋值可能带来危害abpt1pt2main&a&bp1p2temp&b&aswap2?随机值55959 例6.3③#includevoidswap3(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}p1p2p&a&a&b这种方法是交换形参p1和p2的值,使它们的指向发生改变,但是main函数中的a和b的值并没有进行交换所以输出为:a=5,b=95a9b&apt1&bpt2main&b&aswap3 前面我们用到的函数,有些无返回值,有些有返回值,返回值类型多为int,float,char.一个函数的返回值也可以是一个指针类型的数据(即地址)定义函数:数据类型*函数名(形参表列){函数体;}例:int*fun(inta,intb){函数体;}说明:定义一个返回指针值的函数与以前定义函数格式基本类似,只是在函数名前加*,它表明该函数返回一个指针值,而这个指针值是指向一个int型数据二、函数返回指针 例:#include#include#defineSIZE100charbuf[SIZE];char*p=buf;char*alloc(intn){char*begin;if(p+n<=buf+SIZE){begin=p;p=p+n;return(begin);}elsereturn(NULL);}voidmain(){char*p1,*p2;inti;p1=alloc(10);strcpy(p1,”123456789”);p2=alloc(5);strcpy(p2,”abcd”);printf(“buf=%p ”,buf);printf(“p1=%p ”,p1);printf(“p2=%p ”,p2);puts(p1);puts(p2);for(i=0;i<15;i++)printf(“%c”,buf[i]);} buf[0]buf[1]::buf[9]buf[10]:buf[14]buf[15]::buf[99]bufpbuf+10p1p2mainbeginnallocbufbufbuf+1012:9a:10buf+15beginnallocbuf+105 函数的指针:函数的入口地址在程序执行过程中调用函数时,计算机会转去执行函数体内的语句,因此计算机必须知道函数在什么地方。实际上函数在内存中也要占据一片存储单元,这片存储单元一个起始地址,我们称其为函数的入口地址,即函数的指针,这个函数的入口地址是用函数名来表示。因此我们可以定义一个指针变量,让它的值等于函数的入口地址,然后可以通过这个指针变量来调用函数,该指针变量称为指向函数的指针变量三、指向函数的指针 指向函数的指针变量1.定义格式:数据类型(*指针变量名)(形参表列);int(*pt)(intarr[],intn);说明:①数据类型:指针变量所指向的函数的返回值类型②形参表列:即指针变量所指向的函数的形参表列③格式中的小括号不能省略2.应用(1)让指针变量指向函数pt=add;因为函数名为函数的入口地址,所以直接将函数名赋给指针变量即可(2)使用指针变量调用函数格式:(*指针变量名)(实参表列) 例求一维数组中全部元素的和#includeintadd(intb[],intn);voidmain(){inta[6]={1,3,5,7,9,11},total;int(*pt)(intb[],intn);pt=add;total=(*pt)(a,6);printf(“total=%d ”,total);}intadd(intb[],intn){inti,sum=0;for(i=0;ivoidmain(){inta[5]={1,3,5,7,9},*p,j;for(p=a;pvoidinv1(intx[],intn){inttemp,i,j,m=(n-1)/2;for(i=0;i<=m;i++){j=n-1-i;temp=x[i];x[i]=x[j];x[j]=temp;}}voidmain(){inti,a[6]={1,3,4,6,7,9};inv1(a,6);for(i=0;i<6;i++)printf(“%3d”,a[i]);printf(“ ”);}a[0]a[1]a[2]a[3]a[4]a[5]x[0]x[1]x[2]x[3]x[4]x[5]134679976431maininv1 例6.7②实参用数组名,形参用指针变量#includevoidinv2(int*x,intn){inttemp,m=(n-1)/2;int*p,*i,*j;i=x;j=x+n-1;p=x+m;for(;i<=p;i++,j--){temp=*i;*i=*j;*j=temp;}}voidmain(){inti,a[6]={1,3,4,6,7,9};inv2(a,6);for(i=0;i<6;i++)printf(“%3d”,a[i]);printf(“ ”);}134679a[0]a[1]a[2]a[3]a[4]a[5]axai6na+5ja+2pinv29173642mtemp1a+1a+4a+2a+334i和j的指向会变化,p的指向保持不变 例6.7③实参和形参都用指针变量#includevoidinv3(int*x,intn);voidmain(){int*p,a[6]={1,3,4,6,7,9};p=a;inv3(p,6);for(p=a;pvoidinv4(intx[],intn);voidmain(){int*p,a[6]={1,3,4,6,7,9};p=a;inv4(p,6);for(p=a;pintmax,min;voidm1(intarr[],intn){int*p,*end;end=arr+n;max=min=*arr;for(p=arr+1;pmax)max=*p;elseif(*pvoidmain(){inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};int*p;}for(p=a[0];pvoidmain(){inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};int(*p)[4],i,j;p=a;for(i=0;i<3;i++){for(j=0;j<4;j++)printf(“%6d”,*(*(p+i)+j));printf(“ ”);}} 指向二维数组元素的指针二维数组用得较多的是“字符串数组”,配合字符串的操作,使字符串处理更加方便、灵活。chara[4][256]={"Pascal","VC","Basic","Java"};a[0]a[1]a[2]a[3]PascalVcBasicJava #include#include#defineMAXLEN256#defineN4voidmain(){inti,j;chartemp[MAXLEN];charname[N][MAXLEN]={"Pascal","VC","Basic","Java"};for(i=0;i0){strcpy(temp,name[i]);strcpy(name[i],name[j]);strcpy(name[j],temp);}选择法排序//书名的最大长度+1指向二维数组元素的指针比较两个字符串大小复制字符串Quiz选择法排序 Assignment1、将数组a[2][3]中的每个元素向右移一列,最后一列换到最左一列(如右图所示)要求:必须用指针实现321654=a2135462、将数组a[M][N]中的每个元素向右移一列,最后一列换到最左一列要求:必须用指针实现 Experiment实验题目:指向二维数组的指针编程实验目的:深入理解如何用指针变量表示二维数组的元素和元素的地址,学会用指向二维数组的指针变量作函数参数实验内容:编程找出二维数组中的鞍点,二维数组的鞍点是指在该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。要求必须用指针实现。编写一个找鞍点的函数,用指向二维数组的指针变量作函数参数 6.4指针与字符串一、字符指针1.定义指向字符串的指针变量char*p=“China”;说明:这里没有定义字符数组,但字符串在内存中还是以数组形式存放的.字符串在内存中占有一片连续的存储单元,以‘’结束注意:赋值只是把字符串的首地址赋给p,而不是把字符串赋给p,p是一个指针变量,它不能存放一个字符串,只能存放一个地址China2460246124622463246424652460p将字符串的首地址赋给p 2.输出字符串:printf(“%s ”,p);输出字符串时,先输出p指向的第一个字符,然后系统自动执行p++,使p指向下一个字符,再输出该字符,直到遇到‘’为止也可以用循环逐个输出字符串中的字符:for(;*p!=‘’;p++)printf(“%c”,*p);China2460246124622463246424652460p24612462246324642465二、字符数组与字符指针变量的区别chars[]=“CLanguage”;char*p=“CLanguage”;1.存储方式不同:s存放的是字符串中的字符和‘’p存放的是字符串的首地址 2.虽然s和p都能代表字符串的首地址,但s是数组名,是一个常量,而p是一个指针变量,因此s++的写法是错的,而p++的写法是对的char*p1,*p2=“abcd”;p1=“China”;chars[12],str[]=“good”;s[12]=“China”;s=“China”;3.赋值方式不同s可以进行初始化,但不能使用赋值语句p既可以初始化,也可以赋值错4.定义数组s时,系统会给s分配一片连续的存储单元定义指针变量p时,只给p分配一个存储单元 三、字符串指针作函数参数例6.20实现字符串复制①voidcopystr(charfrom[],charto[]){inti=0;while(from[i]!=‘’){to[i]=from[i];i++;}to[i]=‘’;}voidmani(){chara[]=“cat”,b[]=“tiger”;puts(a);puts(b);copystr(a,b);puts(a);puts(b);}cattigerabfromatobcat相当于b[i]=a[i] 例6.20②voidcopystr(char*from,char*to){for(;*from!=‘’;from++,to++)*to=*from;*to=‘’;}voidmain(){char*a=“cat”,*b=“tiger”;puts(a);puts(b);copystr(a,b);puts(a);puts(b);}cattigerabfromatobcata+1b+1a+2b+2a+3b+3

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

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

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