下载此文档

第九讲指针.docx


文档分类:IT计算机 | 页数:约16页 举报非法文档有奖
1/16
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/16 下载此文档
文档列表 文档介绍
该【第九讲指针 】是由【秋天教育】上传分享,文档一共【16】页,该文档可以免费在线阅读,需要了解更多关于【第九讲指针 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。第九章 指针本章要点:掌握指针与指针变量的概念;掌握指针的定义;掌握指针的运算;、数组、字符串、结构体的指针变量 ,了解函数指针变量;掌握main()函数的命令行参数。 指针概念变量地址:变量一定占用一个数据的存储空间,该存储空间的首地址称变量地址。指针:一个变量的地址称为该变量的指针。指针变量:若一个变量专用于存放另一个变量的地址(指针) ,则该变量称为指针变量。若指针变量 p的值等于变量 x的地址,则说指针变量 p指向变量x直接访问:按变量地址存取变量值的方式。间接访问:将变量 i的地址存放在另一内存单元中。如定义i_pointer为指针变量,i_pointer=&i;先找到存放i的地址的单元地址(3010,3011);取出i的地址(2000);到2000, 指针变量的定义指针变量定义的形式:类型标识符 *标识符例如:float *pointer_x;int *pointer_i;作用:定义某些变量为指针类型,使之专门用于存放地址。注意:(1)*用于定义指针变量,但指针变量名不带 *如 int *point_i; 定义的指针变量为point_i,不是*point_i(2)一个指针变量只能指向同一类型的变量如int*point_i;point_i只能用于指向整型变量。 指针变量的引用(1)取地址运算符 &(2)指针运算符 *(取内容)如:若有变量定义: inta, *pa;a为变量; &a就是a的地址;pa为指针变量; *pa就是pa指向的变量;若pa=&a,则*pa实际就是 a。例如main(){int a,b;int *pa, *pb;a=100; b=10;pa=&a;pb=&b;printf( “%d,%dn”,a,b);printf( “%d,%dn”,*pa,*pb);}对*及&的说明:(同级运算,由右向左)例:将两个整型数 a,b按由大到小次序输出。main(){int *p1,*p2,*p,a,b;scanf( “%d,%d”,&a,&b);p1=&a;p2=&b;if(a<b){p=p1;p1=p2;p2=p;}printf( “a=%d,b=%dn”,a,b);printf( “larger=%d,little=%dn”,*p1,*p2);}运行情况:5,9?a=5,b=9larger=9,little=5注意:a和b并未交换,但 指针变量作函数参数作用:将一个变量的地址传至另外一个函数中。swap(p1,p2)int *p1,*p2;{int p;p=*p1;*p1=*p2;*p2=p;}交换指针所指向的变量值main(){int a,b;int *pa, *pb;scanf( “%d,%d”,&a,&b);pa=&a;pb=&b;if(a<b)swap(pa, pb);printf( “%d,%dn”,a,b);}运行情况:5,99,5函数调用过程如下图所示:开始调用 swap函数,实参 pa、pb分别向形式参数 p1、p2传递数据执行函数语句, p1、p2所指向的变量的值相互交换函数调用结束后, p1、p2所占用的内存单元被释放,·单向传递,值传递问题swap(x,y)intx,y;{intt;t=x;x=y;y=t;}main(){int a,b;scanf( “%d,%d”,&a,&b);if(a<b)swap(a, b);printf( “%d,%dn”,a,b);}形参值的改变无法传递给实参改变指针形参的值,也不能使指针实参的值改变swap(p1,p2)int *p1,*p2;{int *p;p=p1;p1=p2;p2=p;}语言中,实参和形参间的数据是单向值传递方式。指针做函数参数也遵循该原则main(){int a,b;int *pa, *pb;scanf( “%d,%d”,&a,&b);pa=&a;pb=&b;if(a<b)swap(pa, pb);printf( “%d,%dn”,*pa,*pb);}如输入数据为:5,9结果为:5,·数组的指针:数组的起始地址。·数组元素的指针:数组元素的地址。·数组名可视为地址常量。:int a[10];int*pa;pa=a;表明指针(或pa=&a[0])pa指向数组a的首地址;此时,指针对象*pa为a[0];pa+n表示数组第n个数据的地址即pa+n=&a[n]*(pa+n)是a[n] 通过指针引用数组元素引用数组中的元素可以用以下方法:下标法 如 a[3]指针法 即通过指向数组元素的指针找到所需的元素 .这种方法占内存少 , 运行速度快 ,,并已赋了一个地址p=&a[0]; 则:,它指向某一个p+1表示数组中的下一个元素,? a+i和p+i都是a[i]的地址,或者说它们指向 a[i].*(a+i)或*(p+i)是a+i或p+i所指向的数组元素。? 指向数组的指针变量也可带有下标,如 p[i]与*(p+i)等价。例:输出数组全部元素下标法:main(){inta[10],i;for(i=0;i<10;i++)scanf( “%d”,&a[i]);printf( n“”);for(i=0;i<10;i++)printf( “%5d”,a[i]);}通过数组名计算数组元素地址,找出数组元素for(i=0;i<10;i++)printf( “%5d”,*(a+i));用指针变量指向数组元素for(p=a;p<(a+10);p++)printf( “%5d”*p,);例:用指针处理数据。#include “(”){inta[10],*pa,i;for(i=0;i<10;i++)a[i]=i+1;pa=a;for(i=0;i<10;i++,pa++)printf( “%d”,*pa);printf( n“”);}例:给定 10个整数,求最大值。#include “#define” N 10main(){int a[N]={5,7,3,6,2,1,8,9,4,0};int i,*p, max;p=a;max=*p++;for(i=1; i<N; i++,if(*p>max)printf ( “max=%d\np++ )max= *p“,max);;},如果形参数组中个元素的值发生变化,实参数组元素的值也随之变化,为什么?若有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下4种情况:形参与实参都用数组名实参用数组名,形参用指针变量实参形参均用指针变量实参为指针变量,形参为数组名例如:用选择法对10个整数排序main(){int*p,i,a[10];voidsort();p=a;for(i=0;i<10;i++)scanf(“%d”,p++);p=a;sort(p,10);for(p=a,i=0;i<10;i++)printf(“%d”,*p++);}void sort(x,n)intx[],n;{inti,j,t;for(i=0;i<n-1;i++){for(j=i+1;j<n;j++)if(x[i]>x[j]){t=x[i];x[i]=x[j];x[j]=t;}}}、多维数组的地址假设数组名为 a,起始地址设为 200Statica[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};?a代表整个二维数组的首地址,即第 0行的首地址?a+1是数组a第1行首地址(208)则:?a[0],a[1],a[2]是二维数组中三个一维数组的名字(地址)地址,即:a[0]=a+0、a[1]=a+1、a[2]=a+2?a[i]+j是第i行j列的地址?*(a[i]+j)是该地址存储的值,,是第0行,第1行,第2行的首即a[i][j]考虑*(a[2]+3)=?注意:a[i]和*(a+i)无条件等价a+i、a[i]、*(a+i)、&a[i][0]均表示第i行首地址;?&a[i][j]、a[i]+j、*(a+i)+j 都是第i行j列元素的地址;a[i][j]、*(a[i]+j)、*(*(a+i)+j)都是第i行j列元素的值;二、指向数组的指针变量定义格式:类型说明符(*变量名)[常量表达式]功能: 定义一个名为“变量名”的指针变量,这个指针变量所指的对象是一个有量表达式”个元素的一维数组例如:若有 int(*pa)[4];则: 被定义成一个指针变量,它所指对象是一个有 4个整型元素的数组例如:输出二维数组任一行任一列元素的值“常main(){inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};int(*p)[4],i,j;p=a;scanf( “%d%d”,&i,&j);printf( “a[%d][%d]=%dn”,i,*(*(p+i)+j));j,}例如:有一个班, 3个学生,各学 4门课,计算总平均分,以及第 n个学生的成绩voidaverage(p,n)float*p;intn;{floatsum=0,aver;for(;p<p+n;p++)sum=sum+(*p);aver=sum/n;printf( “average=%6n.”2f,aver);}voidsearch(p,n)float (*p)[4];intn;{inti;printf( “thescoreofNo.%daren”:,n);for(i=0;i<4;i++)printf( “% “,*(*(p+n)+i));}main(){floatscore[3][4]={{65,67,70,80},{80,90,78,91},{70,79,75,89}};average(score,12);search(score,2);},如:mian(){harstring[]= “IloveChina! ”;printf( “n%s”,string);}用字符指针实现,如:mian(){char *string= “IloveChina! ”;printf(“n%s”,string);}运行结果:IloveChina!请编写函数返回 0.intfun(char*str),它的功能是判别字符串str是否是"回文",若是,返回1,否则例如, “13531”,“helleh是回文”,但“1353”,“Helleh不是”回文.#include""int flag=0;intfun(char*str){intn=0,k;char*p1=str;flag=0;while(*p1){ n++; p1++;}for(k=0;k<n/2;k++)if(*(str+k)==*(str+n-k)flag=1;returnflag; }voidmain(){chars[128];printf("\nPleadeenterstring:\n");gets(s);fun(s);}字符指针使用中的几点事项:。如串的结束符是‘为13;换行符\0’它的数值为0;回车符的数值的值为10;文件结束符的数值为 27;。前面讲过的指针使用中要注意的问题同样适用于字符指针。字符指针变量与字符数组的比较:·字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是字符串的首地址。·赋值方式:对数组的赋值方法有:charstr[]= “Iamaboy! ”或: charstr[20];scanf( “%s”,str);对字符指针变量的赋值方法有三种:(1)char*pa= “Iamaboy! ”(2)char*pa;pa=“Iamaboy! ”(3)char*pa,str[20];pa=str;scanf( “%s”,pa); 用函数指针变量调用函数可以用指针变量指向一个函数。一个函数在编译时被分配一个入口地址,这个入口地址称为函数的指针。例:求a和b中的大者。main (){int max();

第九讲指针 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数16
  • 收藏数0 收藏
  • 顶次数0
  • 上传人秋天教育
  • 文件大小165 KB
  • 时间2024-03-25