善于利用指针_第1页
善于利用指针_第2页
善于利用指针_第3页
善于利用指针_第4页
善于利用指针_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

1、1 29.1 9.1 指针与指针变量的概念指针与指针变量的概念 10110220120230130240140250150260160232 2、变量地址、变量地址系统分配给变量的内存单元的起始地址系统分配给变量的内存单元的起始地址 420002004200620052001200220033 3、指针与指针变量、指针与指针变量l指针:指针:一个变量的地址一个变量的地址l指针变量:指针变量:专门存放变量地址的变量专门存放变量地址的变量5l 直接访问:按变量名来存取变量值直接访问:按变量名来存取变量值l 间接访问:通过存放变量地址的变量去访问变量间接访问:通过存放变量地址的变量去访问变量.200

2、02004200620052001200220038.1 8.1 指针变量的定义指针变量的定义将20送到i-pointer所指向的的单元中6.200020042006200520012002200378.2 指针变量指针变量1.指针变量的定义指针变量的定义l一般形式:一般形式: 存储类型存储类型 数据类型数据类型 *指针名;指针名;合法标识符指针变量本身的存储类型表示定义指针变量不是*运算符例 int *p1,*p2; float *q ; static char *name;注意:1、int *p1, *p2; 与 int *p1, p2;2、指针变量名是p1,p2 ,不是*p1,*p23、

3、指针变量只能指向定义时所规定类型的变量,这个规定 的类型称为该指针变量的“基类型”。 4、指针变量定义后,变量值不确定,应用前必须先赋值指针的目标变量的数据类型图图 未初始化的指针未初始化的指针85、在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符用以表示指针变量所指的变量。92.为什么要为指针变量定义类型:为什么要为指针变量定义类型:对指针进行进行移动对指针进行进行移动1个位置的操作,如果是个位置的操作,如果是整数整数型,就意味着移动型,就意味着移动2个字节,如果是个字节,如果是字符字符型,就意味着移动型,就意味着移动1个字节。这就造成指针

4、移个字节。这就造成指针移动的不确定性,所以需要规定一个动的不确定性,所以需要规定一个基类型基类型。 3.14 2.12pP+14bytepP+1P+2P+312342byte103、指针变量的运算、指针变量的运算 指针运算符指针运算符(“&”和和“*” ) “&”(地址运算符地址运算符) :取变量的存储地址。:取变量的存储地址。 “*” (引用运算符引用运算符) :是取指针所指向变量的内容:是取指针所指向变量的内容 。ptr指向了变量i ,*ptr表示i的值,即3 如:如: int *p , i=3, j=5; p=&i; /*把把i的地址赋给的地址赋给p,让,让p其指

5、向变量其指向变量i */这里,这里,*p与变量与变量i是等价的。是等价的。11定义后定义后:100010021004ijp(1)优先级:高于算术运算符,低于正负号运算符。)优先级:高于算术运算符,低于正负号运算符。 int i , j , *p; /*此行的“*”与下面的不同*/ p=&i; *p=3; j=*p+2;p=&i后后:100010021004ijp1000*p=3后后:100010021004ijp10003j=*p+2后后:100010021004ijp10003512main()int a,*p;a=3;p=&a;printf(%d %d %d,p,*

6、p,&p); 输出结果:-44 3 -42a的地址p的地址p所指向a的内容i_pointer-指针变量,它的内容是地址量*i_pointer-指针的目标变量,它的内容是数据&i_pointer-指针变量占用内存的地址13例例8.1 通通过指针变量访问整型变量。过指针变量访问整型变量。解题思路:先定义解题思路:先定义2个整型变量,再定个整型变量,再定义义2个指针变量,分别指向这两个整型个指针变量,分别指向这两个整型变量,通过访问指针变量,可以找到它变量,通过访问指针变量,可以找到它们所指向的变量,从而得到这些变量的们所指向的变量,从而得到这些变量的值。值。14#include i

7、nt main() int a=100,b=10; int *pointer_1, *pointer_2; pointer_1=&a; pointer_2=&b; printf(“a=%d,b=%dn”,a,b); printf(“*pointer_1=%d,*pointer_2= %dn”,*pointer_1,*pointer_2); return 0;定义两个指针变量定义两个指针变量使使pointer_1指向指向a使使pointer_2指向指向b直接直接输出变量输出变量a和和b的值的值间接间接输出变量输出变量a和和b的值的值15#include int main() in

8、t a=100,b=10; int *pointer_1, *pointer_2; pointer_1=&a; pointer_2=&b; printf(“a=%d,b=%dn”,a,b); printf(“*pointer_1=%d,*pointer_2= %dn”,*pointer_1,*pointer_2); return 0;此处此处*与与类型名类型名在一起。在一起。此时共同定义指针变量此时共同定义指针变量此处此处*与指针变量一起使用。此与指针变量一起使用。此时时代表指针变量所指向的变量代表指针变量所指向的变量& 关于运算符关于运算符&和和 * 的几点说

9、明:的几点说明:(2)结合性)结合性:自右向左自右向左 main() int a,b; int *pointer_1, *pointer_2; a=100;b=10; pointer_1=&a; pointer_2=&b; printf(%d,%dn,a,b); printf(%d,%dn,*pointer_1, *pointer_2); 两个printf函数作用是相 同吗? 程序中有两处出现*pointer_1和*pointer_2作用一样吗? “pointer_1=&a”和 “pointer_2=&b”能不能写成“*pointer_1=&a”和 “*

10、pointer_2=&b” *&a =? &*pointer_1=?相同相同不一样不一样不能不能相当于相当于 *(&a)=a=100&(* pointer_1)= &(a)=&a= pointer_1174、&与与*运算符运算符l 含义含义l 两者关系:互为两者关系:互为逆运算逆运算l 理解理解200020042006200520012002200318198.2.3 指针的赋值运算(=) 指针的赋值运算:就是把地址赋值给指针变量。 指针的赋值运算可以是以下2种方式: 使用取地址运算符,把地址值赋值给指针变量。使用取地址运算符,把

11、地址值赋值给指针变量。 如:int i, *pi ; pi=&i ; 把指针变量的值赋给另一个指针变量。把指针变量的值赋给另一个指针变量。 如:int i,*pa,*pb; pa=&i ; pb=pa;20注意:注意:1.不允许把一个数赋予指针变量,故下面的赋值是错误的:2. 被赋值的指针变量前不能再加“*”说明符,如写为*p=&a 也是错误的。 int *p; p=1000;3.指针变量间的赋值和引用应保证基类型相同。若有定义: int *p , i ; float *q , x ;则:q=&i ; p=&x ; 21例 main( ) int i=1

12、0; int *p; *p=i; printf(“%d”,*p); 危险!例 main( ) int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); 指针变量必须指针变量必须先赋值先赋值, ,再使用再使用.2000200420062005整型变量i10指针变量p200120022003随机222324例:int i,j,*p1,*p2; i=a; j=b; p1=&i; p2=&j;p2=p1*p2=*p1; 255 5、零指针与空类型指针、零指针与空类型指针零指针:零指针:( (空指针空指针) )l 定义定义: : 指针变量值

13、为零指针变量值为零l 表示:表示: int * p = 0; l p = NULL p = NULL与未对与未对p p赋值不同赋值不同l 用途用途: : 避免指针变量的非法引用避免指针变量的非法引用在程序中常作为在程序中常作为状态状态比较比较 说明:说明:NULLNULL是包含是包含stdio.hstdio.h中的一个系统常量,代表中的一个系统常量,代表0 0值值26void *类型指针类型指针l 表示表示: void *p; l 使用时要进行使用时要进行强制类型转换强制类型转换276 6、引用指针变量、引用指针变量格式:格式: * *指针变量指针变量28【例【例】不同类型的指针操作同一内存变

14、量】不同类型的指针操作同一内存变量 29.2008。30交换前35a1a2P1 &a1P2 &a235a1*p2a2*p1交换后P1 &a2P2 &a1p=p1;p1=p2;p2=p318.2.4.指针变量作为函数参数指针变量作为函数参数地址传递地址传递函数的参数不仅可以是整型、实型、字符型等数据,还可以函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函是指针类型。它的作用是将一个变量的地址传送到另一个函数中。特点:数中。特点:共享内存共享内存,“双向双向”传递传递swap(int x,int y) int

15、temp; temp=x; x=y; y=temp;main() int a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);例 将数从大到小输出.20002008200A2002200420065变量a 变量b(main)9 变量temp 变量y 变量x(swap)559 59COPY328.2.4.指针变量作为函数参数指针变量作为函数参数地址传递地址传递特点:特点:共享内存共享内存,“双向双向”传递传递swap(int x,int y) int temp; temp=x; x=y; y=temp;ma

16、in() int a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);例 将数从大到小输出值传递.20002008200A2002200420065变量a 变量b(main)9运行结果:5, 9x=9,y=5不能企图通过改变形参的值而使实参的值改变。 33swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); poin

17、ter_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型变量a 整型变量b(main)指针pointer_1指针pointer_220002002(swap)指针p1指针p2整型p5920002002COPY5例 将数从大到小输出34swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*

18、pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型变量a 整型变量b(main)指针pointer_1指针pointer_22000200259例 将数从大到小输出运行结果:9,5地址传递a,b值被改变,指针变量实现“双向”传递35pointer_1=&a; pointer_2=&b;swap

19、(pointer_1,pointer_2)在函数调用时,将实参变量的值传递给形参变量。采取的依然是“值传递”方式。 swap(int *p1, int *p2)执行swap函数的函数体使*p1和*p2的值互换,也就是使a和b的值互换。 p=*p1;*p1=*p2;*p2=p;函数调用结束后,p1和p2不复存在(已释放) 36swap(int *p1, int *p2) int *p; *p=*p1; *p1=*p2; *p2=*p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&

20、amp;a; pointer_2=&b; if(ab) swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);运行结果:9,9编译警告!编译警告!结果不对!结果不对!int x;int *p=&x;例 将数从大到小输出.20002008200A200220042006200C200E2010.59整型变量a 整型变量b(main)指针pointer_1指针pointer_2200020029920002002COPY(swap)指针p1指针p2指针p*假设2000指针变量在使用前必须赋值!p是指针变量,*p1是整型变量a。37swap(i

21、nt x,int y) int t; t=x; x=y; y=t;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(*pointer_1,*pointer_2); printf(n%d,%dn,a,b);运行结果:5,9例 将数从大到小输出值传递.20002008200A200220042006200C200E2010.59整型a 整型b(main)pointer_1pointer_2200020029COP

22、Y(swap)整型x整型b整型t555 938例 将数从大到小输出swap(int *p1, int *p2) int *p; p=p1; p1=p2; p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(pointer_1,pointer_2); printf(%d,%d,*pointer_1,*pointer_2);.20002008200A200220042006200C200E2010.59整

23、型a 整型b(main)pointer_1pointer_22000200220002002COPY(swap)指针p1指针p2指针p*2000地址传递20002002运行结果:5,93955p1,p2的值被改变,但不能企图通过改变指针形参的值而使指针实参的值改变。 所以pointer_1,pointer_2的值不变7.指针变量作为函数参数地址传递40注意:函数的调用可以(而且只可以)得注意:函数的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针到一个返回值(即函数值),而使用指针变量作参数,可以得到多个变化了的值。变量作参数,可以得到多个变化了的值。如果不用指针变量是难以做到这一

24、点的。如果不用指针变量是难以做到这一点的。要善于利用指针法。要善于利用指针法。41 例例8.5 输入输入3个整数个整数a,b,c,要求按由大,要求按由大到小的顺序将它们输出。用函数实现。到小的顺序将它们输出。用函数实现。解题思路:采用例解题思路:采用例8.3的方法在函数中改的方法在函数中改变这变这3个变量的值。用个变量的值。用swap函数交换两函数交换两个变量的值,用个变量的值,用exchange函数改变这函数改变这3个变量的值。个变量的值。42#include int main() void exchange(int *q1, int *q2, int *q3); int a,b,c,*p1

25、,*p2,*p3; scanf(%d,%d,%d,&a,&b,&c); p1=&a;p2=&b;p3=&c; exchange(p1,p2,p3); printf(“%d,%d,%dn,a,b,c); return 0;调用结束后不会调用结束后不会改变指针的指向改变指针的指向43void exchange(int *q1, int *q2, int *q3) void swap(int *pt1, int *pt2); if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2*q3) swap(

26、q2,q3); void swap(int *pt1, int *pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; 交换指针指交换指针指向的变量值向的变量值44(2)(2)注意事项注意事项同一符号在不同的场合作用不同同一符号在不同的场合作用不同举举例例intint a; a; intint * *pa = &a; pa = &a; / /* * 星号是标识指针类型的语法符号星号是标识指针类型的语法符号 * */ / * *pa = 8; pa = 8; / /* * 星号是间接运算符号星号是间接运算符号 * */ / a = a a

27、 = a * * 10; 10; / /* * 星号是算术乘运算符号星号是算术乘运算符号 * */ /间接运算间接运算( (* *) )的对象只能是地址量的对象只能是地址量举举例例intint a; a; intint * *pa = &a; pa = &a; * *papa = 8; = 8; / /* * 通过指针通过指针p p给给a a存了存了8 8 * */ / * *&a&a = 100; = 100; / /* * 通过指针常量通过指针常量&a&a给给a a存了存了100 100 * */ /45例1 指针的概念main() int

28、a; int *pa=&a; a=10; printf(a:%dn,a); printf(*pa:%dn,*pa); printf(&a:%x(hex)n,&a); printf(pa:%x(hex)n,pa); printf(&pa:%x(hex)n,&pa);运行结果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f88(hex).f86f8af8cf8b整型变量a10指针变量paf87f88f89f866. 指针的例子指针的例子46471 1、指针变量的加、减运算、指针变量的加、减运算8.3 8.3 指针和

29、地址运算指针和地址运算 482 2、指针变量的关系运算、指针变量的关系运算l 若若p1p1和和p2p2指向同一数组,则指向同一数组,则 p1p2 p1p2 p1p2 表示表示p1p1指的元素在后指的元素在后 p1=p2 p1=p2 表示表示p1p1与与p2p2指向同一元素指向同一元素l 若若p1p1与与p2p2不指向同一数组,比较无意义不指向同一数组,比较无意义l p=NULLp=NULL或或p!=NULLp!=NULL491 1、数组的指针、数组的指针8.4 8.4 指针与数组指针与数组 50512 2、指向数组的指针变量、指向数组的指针变量8.4 8.4 指针与数组指针与数组 52 535

30、455 例8.6:输出数组中的全部元素。main() int a10,i; for(i=0;i10;i+) ai=i; for(i=0;i5;i+) printf(a%d=%dn,i,ai);(下标法)main() int a10,i; for(i=0;i10;i+) *(a+i)=i; for(i=0;i10;i+) printf(a%d=%dn,i,*(a+i);(通过数组名计算元素的地址,找出元素的值) main() int a10,i,*p; p=a; for(i=0;i10;i+) *(p+i)=i; for(i=0;i10;i+) printf(a%d=%dn,i,*(p+i);(

31、用指针变量指向元素) 第1,2种方法执行效率相同。第3种方法最快。使用下标法引用数组元素: 先计算出数组元素的地址(a+i),然后再找到它指向的存储单元,读入或写入它的值。用指针变量p指向数组元素:它不需要每次重新计算元素地址。56a57想一想:想一想:*ptr+和(和(*ptr)+有没有有没有 区别区别 ?输出结果:232458例如: f(int arr,int n) main() int array10; f(array,10); 实际上,能够接受并存放地址值的只能是指针变量。因此,C编译系统都是将形参数组名作为指针变量来处理的。上例中f(int arr ,int n) 等价于等价于 f(

32、int *arr, int n) 。8.3.4 指针与数组指针与数组59u数组名作函数参数数组名作函数参数l数组名作函数参数,是数组名作函数参数,是地址传递地址传递l如果有一个实参数组,想在函数中改变此数组如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参都可用数组名或指针的元素的值,实参与形参都可用数组名或指针变量。其对应关系有以下变量。其对应关系有以下4种情况:种情况:实参形参数组名指针变量数组名指针变量数组名数组名指针变量指针变量60例 将数组a中的n个整数按相反顺序存放 ij 3 7 9 11 0 6 7 5 4 20 1 2 3 4 5 6 7 8 9ijijijji11

33、760594723实参与形参均用数组实参与形参均用数组名名m=461例 将数组a中的n个整数按相反顺序存放 实参用数组,形参用指针变量37911067542a0a1a2a3a4a5a6a7a8a9xp=x+ma数组60711594723ijijijjiji62例 将数组a中的n个整数按相反顺序存放 void inv(int *x, int n) int t,*i,*j,*p,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) sc

34、anf(%d,p); p=a; inv(p,10); printf(The array has been reverted:n); for(p=a;pa+10;p+) printf(%d,*p);实参与形参均用指针变量63例 将数组a中的n个整数按相反顺序存放 void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The

35、 array has been reverted:n); for(p=arr;parr+10;p+) printf(%d ,*p);实参用指针变量,形参用数组64例:从10个数中找出其中最大值和最小值。 int max,min; /*全局变量*/void max_min_value(int array,int n)int *p,*array_end; array_end=array+n; max=min=*array; for(p=array+1;pmax)max=*p; else if (*pmin)min=*p; return;main()int i,number10; printf(en

36、ter 10 integer umbers:n); for(i=0;i10;i+) scanf(%d,&numberi); max_min_value(number,10);printf(nmax=%d,min=%dn,max,min); int max,min; /*全局变量*/void max_min_value(int *array,int n)int *p,*array_end; array_end=array+n; max=min=*array; for(p=array+1;pmax)max=*p; else if (*pmin)min=*p; return;main()in

37、t i,number10,*p; p=number; printf(enter 10 integer umbers:n); for(i=0;i10;i+,p+) scanf(%d,p); p=number; max_min_value(p,10); printf(nmax=%d,min=%dn,max,min);65l一级指针变量与一维数组的关系一级指针变量与一维数组的关系int *p 与与 int q10 数组名是指针(地址)数组名是指针(地址)常量常量p=q; p+i 是是qi的地址的地址数组元素的表示方法数组元素的表示方法:下标法下标法和和指针法指针法, 即若即若p=q, 则则 pi q

38、i *(p+i) *(q+i) 形参数组形参数组实质上是实质上是指针变量指针变量,即,即int q int *q在定义指针变量(不是形参)时,在定义指针变量(不是形参)时,不能不能把把int *p 写成写成int p;系统只给系统只给p分配能保存一个指针值的内存区分配能保存一个指针值的内存区(一般一般2字节);而字节);而给给q分配分配2*10字节的内存区字节的内存区66u指针与二维数组指针与二维数组l二维数组的地址二维数组的地址对于一维数组:(1)数组名array表示数组的首地址,即array0的地址;(2)数组名array是地址常量(3)array+i是元素arrayi的地址(4)arra

39、yi *(array+i)arrayint array10;67语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a0,a1,a2。每一个一维数组又含有四个元素。 从二维数组的角度来看,a是二维数组名,a代表整个二维数组的首地址,也是二维数组0行的首地址,等于1000。a+1代表第一行的首地址,等于1008 681357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指针行指针列指针列指针 a0 *(a+0) *a &a00 行指针行指针 ,列指针列指针69有一个排,下设3个班,每班有4个战士,排长只管理到班,

40、班长管理战士。排长A00A01A02A03A10A11A12A13A20A21A22A23A0A1A2班长排长走一步班长走一步排长走一步=A+1=&A1A班长走一步=A00A01A02A03A0A0既是数组名,也是数组首元素地址A0=&A00=*(A+0)A0+1A0+1=*(A+0)+1=*A+1=&A01行指针列指针70 a+i = &ai = ai = *(a+i) = &ai0, 值相等,含义不同值相等,含义不同 a+i &ai,表示第表示第i行首地址行首地址,指向行,指向行 ai *(a+i) &ai0,表示第表示第i行第行第0

41、列元素地址,指向列列元素地址,指向列7172732. 指向多维数组元素的指针变量指向多维数组元素的指针变量(1) 指向指向数组元素数组元素的指针变量的指针变量 例例8.12 有一个有一个34的二维数组,要求的二维数组,要求用指向元素的指针变量输出二维数组各用指向元素的指针变量输出二维数组各元素的值。元素的值。74解题思路:解题思路:u二维数组的元素是整型的,它相当于整型变二维数组的元素是整型的,它相当于整型变量,可以用量,可以用int*型指针变量指向它型指针变量指向它u二维数组的元素在内存中是按行顺序存放的二维数组的元素在内存中是按行顺序存放的,即存放完序号为,即存放完序号为0的行中的全部元素

42、后,的行中的全部元素后,接着存放序号为接着存放序号为1的行中的全部元素,依此的行中的全部元素,依此类推类推u因此可以用一个指向整型元素的指针变量,因此可以用一个指向整型元素的指针变量,依次指向各个元素依次指向各个元素75#include int main() int a34=1,3,5,7,9,11,13,15, 17,19,21,23; int *p; for(p=a0;pa0+12;p+) if(p-a0)%4=0) printf(“n”); printf(“%4d”,*p); printf(n); return 0;控制换行控制换行逐个访问各元素时常用此类指针逐个访问各元素时常用此类指针

43、763 3、指向多维数组的指针、指向多维数组的指针_数组指针数组指针 773 3、指向多维数组的指针、指向多维数组的指针_数组指针数组指针 78(2) 指向由个元素组成的一维数组的指针指向由个元素组成的一维数组的指针变量变量 例例8.13 输出二维数组任一行任一列元素的输出二维数组任一行任一列元素的值。值。解题思路:假设仍然用例解题思路:假设仍然用例8.12程序中的二程序中的二维数组,例维数组,例8.12中定义的指针变量是指向中定义的指针变量是指向变量或数组元素的,现在改用指向一维数变量或数组元素的,现在改用指向一维数组的指针变量。组的指针变量。79#include int main()int

44、 a34=1,3,5,7,9,11,13,15, 17,19,21,23; int (*p)4,i,j; p=a; printf(“enter row and colum:); scanf(“%d,%d”,&i,&j); printf(“a%d,%d=%dn”, i,j,*(*(p+i)+j); return 0;行指针行指针aij803. 用指向数组的指针作函数参数用指向数组的指针作函数参数一维数组名可以作为函数参数,多维数组一维数组名可以作为函数参数,多维数组名也可作函数参数。名也可作函数参数。用指针变量作形参,以接受实参数组名传用指针变量作形参,以接受实参数组名传递来的地

45、址。递来的地址。可以有两种方法:可以有两种方法:用指向变量的指针变量用指向变量的指针变量用指向一维数组的指针变量用指向一维数组的指针变量81 例例8.14 有一个班,有一个班,3个学生,各学个学生,各学4门课,门课,计算总平均分数以及第计算总平均分数以及第n个学生的成绩。个学生的成绩。 解题思路:这个题目是很简单的。本例用指解题思路:这个题目是很简单的。本例用指向数组的指针作函数参数。用函数向数组的指针作函数参数。用函数average求总平均成绩,用函数求总平均成绩,用函数search找找出并输出第出并输出第i个学生的成绩。个学生的成绩。82#include int main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,70,60, 80,87,90,81,90,99,100,

温馨提示

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

评论

0/150

提交评论