c程序设计第8章指针_第1页
c程序设计第8章指针_第2页
c程序设计第8章指针_第3页
c程序设计第8章指针_第4页
c程序设计第8章指针_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 实验九实验九 指针指针(一一) 实验内容:实验内容:4 实验九实验九 指针指针(二二) 实验内容:实验内容:4上机作业上机作业指针指针 指针是指针是C C语言的一个重要特色,是一种数据类型,指针的作用语言的一个重要特色,是一种数据类型,指针的作用是:是: 可对内存中各种不同数据结构的数据进行可对内存中各种不同数据结构的数据进行快速处理快速处理 为函数间各类数据的传递提供了简捷便利的方法为函数间各类数据的传递提供了简捷便利的方法 利用指针可以编制出简洁明快、功能强和质量高的程序利用指针可以编制出简洁明快、功能强和质量高的程序可以说没掌握指针就没有掌握可以说没掌握指针就没有掌握C的精华。的精华。

2、 本章将主要介绍以下内容本章将主要介绍以下内容: 指针变量的定义指针变量的定义 指针与数组指针与数组 指针数组指针数组 指针与函数指针与函数指针变量的定义指针变量的定义v 地址及访问方式地址及访问方式 变量的地址是指变量在存储区变量的地址是指变量在存储区域中的物理位置。访问变量有两种域中的物理位置。访问变量有两种方式:方式:直接访问直接访问 指通过变量名或地址直指通过变量名或地址直接访问接访问变量的变量的值值;间接访问间接访问 指把一个变量的地址指把一个变量的地址放在另一个变量中放在另一个变量中(称地址变量称地址变量)然然后通过先找出地址变量的值,再由后通过先找出地址变量的值,再由此地址找到最

3、终要访问的变量值此地址找到最终要访问的变量值v 指针与指针变量指针与指针变量 指针指针就是地址,一个变量的指针就是地址,一个变量的指针 : : 58 23 12 3 : :2000变量i变量j变量k变量m2000200220042006变量p就是指该变量的地址,存放地址的变量就是就是指该变量的地址,存放地址的变量就是指针变量指针变量。3500v指针变量的定义指针变量的定义 : : 10 20 : : 3000 3002abp1p230003002 : : 10 20 : : 3000 3000 它和普通变量一样占用一定的存储空间,但指针变量的存它和普通变量一样占用一定的存储空间,但指针变量的存

4、储空间中存放的不是普通的数据,而是一个地址,因此储空间中存放的不是普通的数据,而是一个地址,因此指针变指针变量是一个地址变量量是一个地址变量。存储类型存储类型 数据数据类型类型 * *标识符标识符例例1 :main( ) int *p1, *p2 , a=10 , b=20 ; p1=&a ; p2=&b ; printf(“%d,%dn” , *p1 , *p2 ); p2=p1 ; printf(“%d,%dn” , *p1 , *p2 ); 结果为:结果为: 10, 20 10, 10注意:注意: 在变量说明中:在变量说明中:标识名前的标识名前的 * * 号仅是一个符号,

5、表号仅是一个符号,表示其后是一个指针变量名;数据类型并不是指针变量示其后是一个指针变量名;数据类型并不是指针变量本身的数据类型,而是指针指向其目标的数据类型。本身的数据类型,而是指针指向其目标的数据类型。 指针运算符:指针运算符: & 获取运算量的地址获取运算量的地址 。如:。如:scanf(“%f”,&a); * 获取地址中的值获取地址中的值 。 如:如: main() float a=10, b=20 , *p; p =&a; a+=b; *p/=b; (*p)+; printf(“n %”,*p); p+; printf(“n %”,*p);1020 : :500

6、5005043020 : :500abp1.520 : :5002.520 : :5042.520 : :500v 指针变量用作函数参量指针变量用作函数参量(e2)(e2)void swap(int *x, int *y) int temp; temp=*x; *x=*y; *y=temp; printf(n x=%d y=%d n,*x,*y);main() int a=10,b=20; swap(&a,&b); printf(n a=%d b=%d n,a,b);void swap(int x, int y)int temp; temp=x; x=y; y=temp; pr

7、intf(n x=%d y=%d n, x, y);main() int a=10,b=20; swap(a,b); printf(n a=%d b=%d n,a,b);10201020 a b x y temp10202010101020&a&b2010&a&b 10 a b x y temp假设已执行假设已执行 p=&a; 1、&*p含义是什么?含义是什么? 先进行先进行*p运算运算,得得a的值的值,再进行再进行&运算运算, &*p 与与 &a 相同,即变量相同,即变量a的地址。的地址。 2、*&a的含义是什么

8、?的含义是什么? 先进行先进行&a运算,得运算,得a的地址,再进行的地址,再进行*运算。运算。 *&a、*p及变量及变量a等价。等价。 3、(*p) + + 相当于相当于a + +。 它与它与*p + + 不同。不同。 4、*p + + 等价于等价于*(p + +),即先进行,即先进行*运算,得到运算,得到 a 的值,然后执行的值,然后执行p+,这样,这样 p 不再指向不再指向a了。了。 关于关于&和和*运算符的说明:运算符的说明:指针仅能进行加、减算术运算如:指针仅能进行加、减算术运算如: p+n,p-n,p+,p-,+p,-p, p-= n, p+= n,p1-p2

9、 等。等。 其中其中 n 是整数,是整数,p、p1、p2 均为指针;均为指针; 施行加法运算时,指针向地址增大的方向移动;施行加法运算时,指针向地址增大的方向移动; 施行减法运算时,指针向地址减小的方向移动;施行减法运算时,指针向地址减小的方向移动; 移动长度取决于指针的基类型,由计算机决定移动长度取决于指针的基类型,由计算机决定;v 指针的关系运算指针的关系运算 设指针设指针p1,p2指向同一数组中的元素,则:指向同一数组中的元素,则: p1、=、=、!=比较的意义;比较的意义; 允许将指针与允许将指针与NULL或数值或数值 0 进行进行 =或或 != 的比较,以便判的比较,以便判定一个指针

10、是否为空指针。定一个指针是否为空指针。注意:注意: 不可将指针与其他类型的对象作比较;不可将指针与其他类型的对象作比较; 若两指针指向不同数组中的元素,也不可比较;若两指针指向不同数组中的元素,也不可比较; v 指针的算术运算指针的算术运算指针与数组指针与数组 v 一维数组的指针表示方法一维数组的指针表示方法 C C语言规定数组名代表数组的首地址。语言规定数组名代表数组的首地址。如:如: int a10 , *p; 则则 : : p=&a0; 和和 p=a;两语句等价两语句等价, ,其作用是把其作用是把 a 数组首地址赋给指针变量数组首地址赋给指针变量 p ,之,之后后 p+ i 就是

11、就是 ai 地址。地址。 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9p,a p+0 p+1 p+2 p+3 p+4 p+5 p+6 p+7 p+8 p+9 引用数组方式:引用数组方式: i=0 9; 因此因此ai等价于等价于: * (p+i),*(a+i) a+0 a+1 a+2 a+3 a+4 a+5 a+6 a+7 a+8 a+9 ai *(a+i) *(p+i)#include “stdio.h” main() int a10, i ; for( i=0; i10 ; i+) ai=rand(); printf(“n”); for( i=0 ; i10; i+) prin

12、tf(“%d”,ai);#include “stdio.h”main() int a10, i ; for( i=0; i10 ; i+) *(a+i)=rand(); printf(“n”); for( i=0 ; i10; i+) printf(“%d”,*(a+i);#include “stdio.h”main() int a10, *p, i ; for(p=a;pa+10;p+) *p=rand(); printf(“n”); for(p=a;p(a+10);p+) printf(“%d”,*p );输出数组中的全部元素输出数组中的全部元素的值。使用下标法、利用数组名计算地的值。使用

13、下标法、利用数组名计算地址,找出元素的值、用指针变量指向数组元素。址,找出元素的值、用指针变量指向数组元素。(e3)比较一下:比较一下:用下标法比较直观;使用指针效率高。用下标法比较直观;使用指针效率高。v 数组名作函数参数数组名作函数参数 用数组名作实参,在调用函数时是把数组的首地用数组名作实参,在调用函数时是把数组的首地址传送给形参。即实参数组与形参数组共占同一段内址传送给形参。即实参数组与形参数组共占同一段内存。存。例例. 将数组将数组a中的中的n个整数按相反顺序存放。个整数按相反顺序存放。(e4) 分析:分析:将将a0与与an-1对换,再将对换,再将a1和和an-2对对换换。设。设i和

14、和j,i的初值为的初值为0,j的初值为的初值为n-1。将。将ai和和aj交换,然后使交换,然后使i的值加的值加1,j的值减的值减1,再将,再将ai和和aj交换,直到交换,直到 i=(n-1)/2为止。为止。 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9i=0 4 , j=95 ai aj 参考程序void inv(int x, int n) int temp, i, j,m=(n-1)/2; for( i=0,j=n-1; i=m; i+,j-) temp=xi; xi=xj; xj=temp; main() int i, a10=3,7,9,11, 0,6,7,5,4,2; p

15、rintf(“nThe array: n ”); for( i=0; i10; i+) printf(“%4d”,ai); inv(a,10); printf(“n The array : n”); for( i=0; i10; i+) printf(“%4d”,ai); printf(“n”); 例、例、 从从10个数中找出其中最大值和最小值。个数中找出其中最大值和最小值。(e5) int max,min; void max_min_value(int a, int n) int *p,*a_end; a_end=a+n; max=min=*a; /* 等价等价max=min=a0 */ f

16、or(p=a+1;pmax) max=*p; else if (*pmin) min=*p; return; main() int i, number10; printf(“enter 10 integer number:n”); for( i=0; i10; i+) scanf(“%d”,&numberi); max_min_value(number,10); printf(“n max=%d,min=%dn”,max,min); 主函数主函数如果有一个实参数组,想在函数中改变此数组的元素的值,实参与如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下形参的

17、对应关系有以下4种情况:种情况:1、形参和实参都用数组名、形参和实参都用数组名f ( int x,int n ) a和和x指的是同一个数组指的是同一个数组 2、实参用数组名,形参用指针变量、实参用数组名,形参用指针变量f( int *x, int n ) 开始时,开始时,x指向指向a0main() inta10; f(a,10); main() int a10; f( a, 10 ); 3 、实参形参都用指针变量、实参形参都用指针变量 f ( int *x, int n ) . 实参实参p和形参和形参x都指向数组都指向数组a 4、实参为指针变量,形参为数组名。、实参为指针变量,形参为数组名。

18、f ( int x, int n ) p指向数组指向数组a,x和和a共用同一段内存单元共用同一段内存单元. main() int a10, *p; p = a; f ( p, 10 ); . m a i n ( ) int a10, *p; p = a; f( p, 10 ); 例例. 用实参指针变量将用实参指针变量将a数组中数组中n 个整数按相反顺序存放个整数按相反顺序存放.(e6)main() int i, a10,*p=a; printf(“The original array: n ”); for( i=0; i10; i+,p+) *p=rand(); printf(“%8d”, *

19、p); printf(“n”); p=a; inv(p,10); printf(“n “n The array is : n”); for( p=a; pa+10; p+) printf(“%8d”, *p); void inv(int *x, int n) int *p, m, temp, *i, *j; m=(n-1)/2; i = x ; j = x + n - 1 ; p=x+m; for( ; i=p; i+, j- - ) temp=*i; *i = *j; *j =temp; return; 例例. 用选择法对用选择法对10个整数排序。个整数排序。(e7)sort(int x,i

20、nt n) int i, j, k, t; for( i=0; in-1; i+) k=i; for(j=i+1; jxk) k=j; if( k !=i) t = xi; xi = xk; xk = t; main() int *p, i, a10; p=a; for( i=0; i10; i+) *p+=rand()%1000; p=a; sort(p,10); for( p=a, i=0; i10; i+) printf(“%5d”,*p);p+; 在使用指针变量时,有几个问题要注意:在使用指针变量时,有几个问题要注意:1、指针变量可以实现使本身的值改变。、指针变量可以实现使本身的值改变

21、。 如:如: for(p=a; p(a+10); p+)2、要注意指针变量的当前值。、要注意指针变量的当前值。3、用指针变量、用指针变量p指向数组元素指向数组元素,可以指到数组以后的内存单元可以指到数组以后的内存单元. C编译程序不作下标越界检查。编译程序不作下标越界检查。4、注意指针变量的运算。如果、注意指针变量的运算。如果p指向数组指向数组a.则:则: p+ (或或 p+=1 ),使,使p指向下一元素指向下一元素a1。 *p+ 等价等价*(p+)。作用是先得到。作用是先得到p指向的变量的值指向的变量的值(即即*p) 然后再使然后再使p+1p。 *(p+)与与*(+p) 不同。前者为不同。前

22、者为a0,后者为,后者为a1 (*p)+表示表示p指向的元素值加指向的元素值加1,即,即 a0+ 如果如果p当前指向当前指向a数组中第数组中第i个元素,则:个元素,则: *(p- -)相当于相当于ai- -,先对,先对p进行进行*运算,再使运算,再使p自减;自减; *(+ p)相当于相当于a+i,先使,先使p自加,再作自加,再作*运算。运算。 *(- - p)相当于相当于a- -i,先使,先使p自减,再作自减,再作*运算。运算。v二维数组的指针表示法二维数组的指针表示法 从前边的应用中可得出一维数组以下两点结论:从前边的应用中可得出一维数组以下两点结论: 数组名代表了该数组的起始地址,也就是第

23、一个元素的起始数组名代表了该数组的起始地址,也就是第一个元素的起始地址。地址。 数组中任何一个元素的地址,都可以用其数组名加上一个偏数组中任何一个元素的地址,都可以用其数组名加上一个偏移量来表示。移量来表示。 这两点可推广到二维乃至多维数组,因这两点可推广到二维乃至多维数组,因C语言用一维数组来语言用一维数组来解释多维数组。可以把二维数组的每一行解释为一个一维数组,解释多维数组。可以把二维数组的每一行解释为一个一维数组,对二维数组对二维数组a来说,可把它看成是由下列元素组成的一维数组:来说,可把它看成是由下列元素组成的一维数组: a0,a1,a2,ai, 这里这里 ai 既是广义一维数组既是广

24、义一维数组 a 的一个元素,又是一个一维数的一个元素,又是一个一维数组组 ai 的名字,是指向的名字,是指向 ai 的起始元素的指针常量。的起始元素的指针常量。例例. 指向数组元素的指针变量指向数组元素的指针变量。(e8_0)main( ) static int a35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; int *p; for (p=a; pa0+15;p + +) printf(“%d”,*p); printf (“n”); main( ) static int a35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; int

25、*p,i; for (i=0;i3;i+) for (p=ai;pai+5;p+) printf(%8d,*p); printf (n); 运行结果:运行结果: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15运行结果:2 3 4 57 8 9 10111 12 13 14 15对二维数组在使用指针变量时,有几个问题要注意:对二维数组在使用指针变量时,有几个问题要注意: l l ak+j 等价于等价于&akj,即,即k行第行第 j 个元素的地址。个元素的地址。 由此得到由此得到: *(ak+j) 等价于等价于akj; l l a0 与与 &a00 等价;等

26、价; l l a+k 与与 ak、&ak0 等价,而等价,而 a0+k 与与 &a0k 等价;等价; l l *(a+i) 可理解为可理解为 ai,故有如下等价关系:,故有如下等价关系: a+0 等价于等价于 a0、 a0+0、 &a00、 *(a+0) a+1 等价于等价于 a1、 a1+0、 &a10、 *(a+1) a+(i-1) 等价于等价于 ai-1、ai-1+0、 &ai-10、 *(a+i-1) l l *(a+k)与与*ak是不同的,前者相当于是不同的,前者相当于ak,是一个地址值;,是一个地址值;后者相当于后者相当于*(ak+0)或或*

27、&ak0,是数组元素,是数组元素ak0中存储的值。中存储的值。 l l 数组元素数组元素akp就是就是*(ak+p),即,即*(*(a+k)+p)例例.有有M个同学考个同学考N门课门课,统计总平均分统计总平均分,并查询第并查询第k个同学的考试成绩。个同学的考试成绩。#include “stdio.h”#define M 3#define N 4main() int i, k, scoreMN, *p; float average(int *, int ); void search(int *, int ,int ); for(i=0;iM;i+) for(p=scorei;pscore

28、i+N;p+) *p=rand()%101; printf(“n average =%5.2fn”,average(score,M*N); printf(“n Input k:”); scanf(%d,&k); search(scorek-1,N,k);函数参考程序函数参考程序float average(int *p, int n) int *p_end=p+n; float sum=0.; while (pp_end) sum=sum+*p+; return sum/n;void search(int *p, int n, int k) int *p_end=p+n; printf(

29、print score of %dth student:n ,k); while(pp_end) printf(%5d , *p+); 字符串和字符指针字符串和字符指针 main() char s6; int i; strcpy(s,data1); for(i=0;i5;i+) printf(%c n,si);main() char *s; int i; s=data1; for(i=0;i5;i+) printf(%c n,*(s+i); 字符串由是一串字符且以字符串由是一串字符且以 0 0 字符为结束标志。字符为结束标志。 字符数组由若干元素组成字符数组由若干元素组成, ,每个元素放一个字

30、符;是一个字符串每个元素放一个字符;是一个字符串 指针变量中存放的是某个元素的存储地址,字符指针指向的是指针变量中存放的是某个元素的存储地址,字符指针指向的是字符元素的地址。字符元素的地址。 赋值方式赋值方式 char str =“Good Bye”; /* 给字符数组赋初值给字符数组赋初值 */ char *s= “Good Bye” ; /* 指针指针s 指向字符串常量的首地址指向字符串常量的首地址*/ 在执行语句中在执行语句中: str=“Good Bye”; 直接给字符数组整体赋值是不允许的直接给字符数组整体赋值是不允许的。 s=“Good Bye”; 把字符串常量的首地址直接给指针变

31、量是把字符串常量的首地址直接给指针变量是 允许的。允许的。 指针变量不同于其他变量,除了在定义时要注意它指向目标指针变量不同于其他变量,除了在定义时要注意它指向目标的数据类型外;在应用中也要注意细节问题。如:的数据类型外;在应用中也要注意细节问题。如: char str 80, *p ; scanf(“%s”,str); scanf (“%s”,p); /*是不允许的是不允许的,p没有获得指向目标的地址,没有获得指向目标的地址, 它是一个不确定的值。它是一个不确定的值。*/例例. 将字符串将字符串2和字符串和字符串3依序放入字符串依序放入字符串1中中(e10)#include stdio.hm

32、ain() char str150, str220=It is a string!; char str3=It is a c programming example; int i , j , k; strcpy(str1,str2); /* 将字符串将字符串2赋给字符串赋给字符串1 */ k=strlen(str1); /* 获取字符串获取字符串1的长度的长度 */ for (i=0; str3i!=0; i+) str1k+i=str3i; /* 将字符串将字符串3中的每个字符依序放入字符串中的每个字符依序放入字符串1 */ str1k+i=0; /* 加一个字符串结束符加一个字符串结束符

33、*/ puts(str1); /* 输出字符串输出字符串1 */用指针做上题:用指针做上题:#include stdio.hmain() char str150,str220=It is a c; char str3=programming example; char *p1=str1,*p2=str2; clrscr(); while(*p2) *p1+=*p2+; p2=str3; while(*p2) *p1+=*p2+; *p1=0; puts(str1); I:Itis ac/0programming:/0p1p2p2例例 。 求某一字符在另一字符串中出现的次数求某一字符在另一字符串

34、中出现的次数(e11)#include stdio.hmain() char *str, c; printf(n Enter a string :); gets(str); printf(n Enter a char :); c=getchar(); printf(n %c is found %d times. n,c,s_count(c,str); s_count(char c1,char *s) int count=0; while(*s) if (*s+=c1 ) count+; return (count); T h i si sab o o k .0使用系统提供的函数进行处理使用系统

35、提供的函数进行处理.#include stdio.h#include ctype.hmain() char *str, *p,c; int n=0; printf(n Enter a string :); gets(str); printf(n Enter a char :); c=getchar(); p=strchr(str,c); /* p 指向指向 c 首次出现的地方首次出现的地方*/ while(p) n+; p=strchr(p+1,c) ; printf(n %c is found %d times. n,c,n); T h isisab o o k0i例例 . 求某一字符串在另

36、一字符串中出现的次数求某一字符串在另一字符串中出现的次数#include stdio.hmain() char *str,*substr; printf(n Enter a string :); gets(str); printf(n Enter a sub-string :); gets(substr); printf(“n %s is found %d times.n”, substr, s_count(substr,str); int s_count(char *s1,char *s) int count=0,flag; char *subs, *str=s; while(*str) f

37、lag=1; for ( subs=s1; *str+=*subs; subs+) flag=0; if (!*(subs+1) count+ ; break; if (flag) str+; return count ; a h i s b a c a b aca 0strac0subs使用系统提供的函数进行处理使用系统提供的函数进行处理.#include stdio.h #include ctype.h main() char *str,*substr,*p; int count=0,len=0; printf(n Enter a string :); gets(str); printf(

38、n Enter a sub-string :); gets(substr); len=strlen(substr); /* 求子串的长度求子串的长度*/ p=strstr(str,substr); /*p指向子串在串中首次出现的位置指向子串在串中首次出现的位置*/ while(p) count+; p=strstr(p+len,substr); printf(n %s is found %d times.n, substr,count); th isisab o o koi s0example#include main() char *p1,*p2; int i,j,k=0; clrscr()

39、; printf(nInput str1:);gets(p1); printf(nInput str2:);gets(p2); for(i=0;*(p2+i);i+) /* while (*p2) while(*p2&*p2!=*p1) p2+; */ for(j=0;*(p1+j)=*(p2+i+j);j+) /*for(j=0;*(p1=j)=*p2;j+,p2+) */ if(!*(p1+j+1)k+;break; printf(n Count=%d,k);a sssm sssa ss0ss0p1p2指针数组指针数组Zhangsan0Lisi0w angw u0M aliu0Su

40、nfei0Lim ing00 1 2 3 4 5 6 7 8 9 10 11100010121024103610481060定义:定义: 类型名类型名 * 数组名数组名长度长度 指针数组是用来存放一组地址的。为什么需要指针数组?指针数组是用来存放一组地址的。为什么需要指针数组? 先看一下下边字符串操作的例子:先看一下下边字符串操作的例子: static char name512=“Zhang san”,”Li si”,”Wang wu”,”Ma liu”, ”Sun fei”, “Li ming” 上边定义了如图所示上边定义了如图所示的二维数组。若一个字的二维数组。若一个字符串的长度比较长,则

41、符串的长度比较长,则要求按此长度定义,这要求按此长度定义,这就会浪费很多内存单元。就会浪费很多内存单元。如右图,不足如右图,不足1212也要占也要占据据1212个字节。由前所述,个字节。由前所述,在初始话时可用指针变在初始话时可用指针变量替代量替代字符数组。字符数组。例例. . 先存储一班学生的名字,从键盘上输入一个学生的名字,先存储一班学生的名字,从键盘上输入一个学生的名字,看是否是该班学生。看是否是该班学生。#include stdio.h“#include ctype.h main()char *name6=Zhang san,Li si,Wang wu,Ma liu,Sun fei,L

42、i ming; char *p; int i, flag=0; printf(“Enter your name:”); gets(p); /*输入名字输入名字*/ for (i=0;i6;i+) if (strcmp(namei,p)=0) flag=1;break; puts(p); /*输出名字输出名字*/ if (flag) printf(“ is in this class.n); else printf(“ is not in this class.n); 例例. . 先存储一班学生的名字,按字母顺序排序:先存储一班学生的名字,按字母顺序排序:#include string.hmai

43、n()char *name6=Zhang-san,Li-si,Wang-wu,Ma- liu,Sun-fei,Li-ming; char *p; int i, j, k; for (i=0;i5;i+) for (k=i, j=i+1;j6;j+) if (strcmp(namek,namej)0) k=j; if (k!=i) p=namei;namei=namek;namek=p; clrscr(); for (i=0;i6;i+) puts(namei);输入一个输入一个 36 的二维整数数组的二维整数数组, 输出其中最大值输出其中最大值, 最小值及其下标。最小值及其下标。Void ma

44、x_min(int *p, int n) int *x, i; x=p0; for (i=0;i*p0) p0=x ; else if(*x*p1 ) p1=x; main () int a36=4,3,9,0,8,7,2,11,3,5,88,6,1,2,3,4,5,65,*p2; clrscr(); p0=p1=a; max_min(p,18); printf(n min=%d row=%d col=%d,*p1,(p1-a)/6,(p1-a)%6); printf(n max=%d row=%d col=%d,*p0,(p0-a)/6,(p0-a)%6);指针与函数指针与函数q 指针用作函

45、数的参数指针用作函数的参数q 返回值是指针的函数返回值是指针的函数q 指向函数的指针指向函数的指针v 指针用作函数的参数指针用作函数的参数 这种使用很普遍,应该熟练掌握。前边我们已多次使用,这种使用很普遍,应该熟练掌握。前边我们已多次使用,如数组名作为参数、变量的地址作为参数。下边看一个例子:如数组名作为参数、变量的地址作为参数。下边看一个例子:例例. 有有n个整数,使其前面各数顺序向后移个整数,使其前面各数顺序向后移m个位置,最后个位置,最后m个个数变成最前面数变成最前面m个数,请编程实现。个数,请编程实现。mn-m续续123456789101012345678991012345678891

46、0123456778910123456原始数据n=10 m=4作循环移动4次1次次2次次3次次4次次程序程序main( ) int a10=1,2,3,4,5,6,7,8,9,10,n=10,m, *p; void move(int x ,int,int); /* 函数说明函数说明*/ printf(“Enter m=“); scanf(%d,&m); move(a , n , m) ; /* 函数调用函数调用*/ for (p=a;px ; pp-) *pp=*(pp-1) ; *x=end; /* 将将 end 放入数组第一个数位置放入数组第一个数位置*/ m-; if (m0)

47、move(x,n,m); /*递归调用递归调用*/v 返回值是指针的函数返回值是指针的函数例:产生例:产生100个个2000以内的随机数,以内的随机数,求出最小数,并指明其位置。求出最小数,并指明其位置。#include stdio.h#define N 100main() int aN,*p,i; int *min(int a,int ); for (i=0;iN;i+) ai=rand()%2000;printf(%5d,ai); p=min(a,N); printf(n min=%d locate=%d n,*p,p-a);int *min(int a,int n) int *p,i; p=a; for (i=0;i*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论