大学计算机程序设计基础(C语言5)ppt课件_第1页
大学计算机程序设计基础(C语言5)ppt课件_第2页
大学计算机程序设计基础(C语言5)ppt课件_第3页
大学计算机程序设计基础(C语言5)ppt课件_第4页
大学计算机程序设计基础(C语言5)ppt课件_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

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

文档简介

1、作业作业: 13.6 13.7 在本例题中,在本例题中, 函数函数sort有三个参数,有三个参数,a是被排序的数组,是被排序的数组,n是数组长度,是数组长度,flag是递增或递减标志;是递增或递减标志; 函数函数swap交换两个变量的值;交换两个变量的值; 函数函数ascending判别能否判别能否ab ; 函数函数descending判别能否判别能否ab 。 当调用当调用sort 时,时,sort 根据根据 flag 的值能否的值能否“ascending,决议按递增,决议按递增或递减排序,把函数名或递减排序,把函数名 ascending 或或 descending 赋值给函数指针变量赋值给函

2、数指针变量 ad 。经过调用经过调用 ad 所指向的函数,所指向的函数,判别能否需求交换数组两个判别能否需求交换数组两个相邻成分。当需求交换时,相邻成分。当需求交换时,调用函数调用函数 swap。经过多次。经过多次扫描,最终到达排序目的。扫描,最终到达排序目的。 函数函数 sort 运用了指向运用了指向函数的指针调用函数函数的指针调用函数 ascending 或或 descending 。例如例如 int (*f) ( float d , char c );声明指向声明指向“前往前往int类型值的函数的函数指针变量类型值的函数的函数指针变量 f ,f 所指向的所指向的函数有两个方式参数函数有两

3、个方式参数: 第一个参数是第一个参数是float类型,类型, 第二个参数是第二个参数是char类型。类型。 函数指针声明中用括号把星号函数指针声明中用括号把星号“*和和“标识符括起来是标识符括起来是必需的,比如上述的必需的,比如上述的“*f,缘由是由优先级呵斥的。引进,缘由是由优先级呵斥的。引进函数指针概念不是凭空臆造的,它的作用在于函数指针概念不是凭空臆造的,它的作用在于运用函数指针调用函数运用函数指针调用函数实现其它程序设计言语中函数参数的功能实现其它程序设计言语中函数参数的功能可以把函数名赋值给一个函数指针变量,然后经过函数指针变可以把函数名赋值给一个函数指针变量,然后经过函数指针变量调

4、用函数。方式是:量调用函数。方式是:函数指针变量函数指针变量 = 函数名;函数名;要求函数指针的特性与函数名的特性一致,这种一致性表达在要求函数指针的特性与函数名的特性一致,这种一致性表达在它们的前往类型一样;它们的前往类型一样;它们的参数个数一样;它们的参数个数一样;对应位置上,每个方式参数的类型一样。对应位置上,每个方式参数的类型一样。运用函数指针要留意:运用函数指针要留意:给函数指针赋值时,右端只是一个函数名,不许带参数表。给函数指针赋值时,右端只是一个函数名,不许带参数表。 ad = ascending 是正确的,而是正确的,而 ad = ascendingint,int 是错误的。是

5、错误的。不能对函数指针变量进展任何运算。不能对函数指针变量进展任何运算。“ad+n、“ad+、“ad- 等是错误等是错误的。的。利用函数指针调用函数时,把利用函数指针调用函数时,把 “* 和函数名用括号括起来,成和函数名用括号括起来,成 *函数名函数名 方式,是必需的。由于方式,是必需的。由于“的优先级高于的优先级高于“*。在例。在例13-3中,调用函中,调用函数指针数指针 ad 所指函数的方式是所指函数的方式是 (*ad)(ac,ac+1) 不能写成不能写成 *ad (ac,ac+1)解:最好能有一个计算定积分的函数解:最好能有一个计算定积分的函数 integrate 可以计算恣意函数可以计

6、算恣意函数 f 在区间在区间 a,b 上的的定上的的定积分,然后分别以函数积分,然后分别以函数等为参数,调用函数等为参数,调用函数 integrate。dxexdxxsixdxxx + +- -20311210 33x2 six x f x dxab( ) 我们希望我们希望 integrate 能计算恣意函数能计算恣意函数 f ,在恣意区间,在恣意区间 a,b 上的定积分。上的定积分。而详细计算那个函数的积分由调用而详细计算那个函数的积分由调用 integrate 时确定。显然时确定。显然 f 作为作为integrate 的一个参数比较适宜。调用的一个参数比较适宜。调用 inegrate 的函

7、数调用可以写成:的函数调用可以写成: integrate(g,a,b)其中其中 g 为被积分函数。这就要求函数为被积分函数。这就要求函数 integrate 带有函数参数,带有函数参数,integrate 的的函数定义阐明符可以写成:函数定义阐明符可以写成: float integrate( float (*f)(float) ,float a, float b ) 函数作参数时,在方式参数表中应列出作参数函数的函数原型。目的是函数作参数时,在方式参数表中应列出作参数函数的函数原型。目的是为了阐明该方式参数函数的特性。为了阐明该方式参数函数的特性。 Yf aYf ahYf ahYf bn012

8、2= = =+ += =+ += =( ),(),(),( )LLSf x dxhYYYYYYabnn= = + + + + + + + - -( )() /)012312LLxex+ +323x x sin 其中,真实参数其中,真实参数 0、1 ; -1.0、1.0 ; 0.0、2.0分别表示积分区间分别表示积分区间 0、1 ,-1.0、1.0 ,0.0、2.0100为把积分区间等分成为把积分区间等分成100份;份; cube、sin2、r 分别为被积函数的函数标识符。分别为被积函数的函数标识符。被积函数被积函数 cube,sin2,r 都是一元函数,都是一元函数,其参数是其参数是 floa

9、t 型的,结果类型也是型的,结果类型也是 float 的。的。被积函数被积函数 cube,sin2,r 的函数定义阐明的函数定义阐明符与符与 integrate 方式参数表中的函数参数阐明方式参数表中的函数参数阐明 float (*f)(float)是一致的。是一致的。 函数函数 bubsort 有三个方式参数,有三个方式参数,s 是欲排序的整数数组,是欲排序的整数数组,Size 是是 s 数组的尺寸数组的尺寸,P 是一个是一个bool型函数,调用型函数,调用 bubsor t时以时以 ascending 函数或者以函数或者以 descending函数作函数作真实参数对应它,详细指明是按递增排

10、序还是按递减排序。真实参数对应它,详细指明是按递增排序还是按递减排序。 s=sum(cos,0.5,3.0); /* 求求cos函数之和函数之和 */ printf(The sum of cos for 0.5 to 3.0 is %e n,s);程序运转结果为:程序运转结果为:The sum of sin for 0.1 to 1.0 is 5.08The sum of cos for 0.5 to 3.0 is -2.44645 函数函数 sum( ) 的第一个参数为函数指针,该指针指向的是带有一个的第一个参数为函数指针,该指针指向的是带有一个double型参数并前往型参数并前往doubl

11、e类型数据的函数。而在头文件类型数据的函数。而在头文件 math.h 中定义中定义的函数的函数 sin( ) 与与 cos( ) 正是这样的函数。正是这样的函数。 主程序中,分别以主程序中,分别以 sin( ) 与与 cos( ) 作真实参数对应作真实参数对应 sum 函数的函数指针函数的函数指针参数参数 func。到达函数。到达函数 sum 分别求分别求 sin 和和 cos 之和。之和。 调用函数调用函数 调用调用 1 1 调用调用 2 . . n-1 调用调用 n n 调用调用 解:把每个语法单位的处置编成一个函数,全局量w放当前读入字符,得:e(*ve) 前往前往t(&v1)w

12、=w1=we(&v2)*ve=v1w1=+*ve=v1+v2*ve=v1-v2 t(*vt) 前往前往f(&u1)w = * /w1=wt(&u2)w1=*vt=u1*u2*vt=u1/u2*vt=u1 f(*vf) 前往前往w=(*vf=we(vf)开场开场 终了终了印印 ve(&v)主函数在开场应该首先读入一个字符;主函数在开场应该首先读入一个字符;E 的处置函数,也应该加上读入字符部分;的处置函数,也应该加上读入字符部分;与与 E 一样,相应一样,相应 T 的处置函数,也应该加上读入字符部分。的处置函数,也应该加上读入字符部分。最后,最后,F 的处置:的处

13、置: 在处置带括号的在处置带括号的 E 之前,应该读入之前,应该读入 E 的第一个字符;的第一个字符; 在处置完在处置完 E 之后,曾经读入右括号,但是还应该把后继符读入之后,曾经读入右括号,但是还应该把后继符读入 在处置数字时,处置完数字后,还应该读入后继符号。在处置数字时,处置完数字后,还应该读入后继符号。读读(w)开场开场终了终了印印 ve(&v)e(*ve) 前往前往t(&v1)w=w1=we(&v2)*ve=v1w1=+*ve=v1+v2*ve=v1-v2读读(w) t(*vt) 前往前往f(&u1)w = * /w1=wt(&u2)w1=*v

14、t=u1*u2*vt=u1/u2*vt=u1读读(w) f(*vf) 前往前往w=(*vf=we(vf)读读(w)读读(w)读读(w)读读(w) 开场开场 终了终了印印 ve(&v)e(*ve) 前往前往w1=we(&v2)*ve=v1-v2*ve=v1w=w1=+*ve=v1+v2t(&v1)读读(w)t(*vt)前往前往w = * /w1=w读读(w)t(&u2)*vt=u1w1=*vt=u1*u2*vt=u1/u2f(&u1)f(*vf) 前往前往w=(*vf=w读读(w)读读(w)e(vf)读读(w)char w ; /* 2 */ float

15、v ; /* 3 */ void t( float *vt ); /* 4 */ void f( float *vf ); /* 5 */ void e( float *ve ) /* 6 */ float v2 , v1 ; /* 7 */ char w1 ; /* 8 */ t(&v1); /* 9 */ if ( w=+) | ( w=-) ) /* 10 */ w1=w ; /* 11 */ scanf( “%c,&w); /* 12 */ e(&v2); /* 13 */ if (w1=+) /* 14 */ *ve=v1+v2 ; /* 15 */ else

16、 /* 16 */ *ve=v1-v2 ; /* 17 */ /* 18 */ else *ve=v1 ; /* 19 */ /* 20 */ void t( float *vt ) /* 21 */ float u1,u2 ; /* 22 */ char w1 ; /* 23 */ f(&u1); /* 24 */ if ( (w=*)|(w=/) ) /* 25 */ w1=w; /* 26 */ scanf( “%c,&w); /* 27 */ t(&u2); /* 28 */ if (w1=*) /* 29 */ *vt=u1*u2; /* 30 */ else

17、 /* 31 */ *vt=u1/u2 ; /* 32 */ /* 33 */ else *vt=u1 /* 34 */ /* 35 */ void f( float *vf ) /* 36 */ if ( w=( ) /* 37 */ scanf( “%c,&w); /* 38 */ e(vf); /* 39 */ scanf( “%c,&w); /* 40 */ else /* 41 */ *vf=(int)w -(int)0; /* 42 */ scanf( “%c,&w); /* 43 */ /* 44 */ /* 45 */ int main(void) /*

18、 46 */ scanf( “%c,&w); /* 47 */ e(&v); /* 48 */ printf(“n = %f n, v ) ; /* 49 */ /* 50 */13.1.4 函数副作用函数副作用 所谓函数副作用是指,当调用函数时,被调用函数除了前往所谓函数副作用是指,当调用函数时,被调用函数除了前往函数值之外,还对主调用函数产生附加的影响。例如,调用函数函数值之外,还对主调用函数产生附加的影响。例如,调用函数时在被调用函数内部时在被调用函数内部修正全局量的值;修正全局量的值;修正主调用函数中声明的变量的值普统统过指针参数实现。修正主调用函数中声明的变量的值普统

19、统过指针参数实现。函数副作用会给程序设计带来不用要的费事,给程序带来非常难函数副作用会给程序设计带来不用要的费事,给程序带来非常难以查找的错误,并且降低程序的可读性。以查找的错误,并且降低程序的可读性。 第三章引见表达式值的计算时曾经举过一个例子,由于双目第三章引见表达式值的计算时曾经举过一个例子,由于双目运算的两个运算分量的计算次序不同,而带来运算结果不同,就运算的两个运算分量的计算次序不同,而带来运算结果不同,就是由函数副作用引起的。是由函数副作用引起的。 对函数副作用的看法与对对函数副作用的看法与对GOTO语句的看法一样,在程序设语句的看法一样,在程序设计言语界不断有分歧,有人主张保管,

20、有人主张取消。我们以为,计言语界不断有分歧,有人主张保管,有人主张取消。我们以为,可以保管函数副作用,但是应该限制程序员尽量不要运用函数副可以保管函数副作用,但是应该限制程序员尽量不要运用函数副作用。由于函数副作用的影响:作用。由于函数副作用的影响:会使双目运算的结果依赖于两个运算分量的计算次序;会使双目运算的结果依赖于两个运算分量的计算次序;还能够使某些在数学上明显成立的现实,在程序中就不一定成立。还能够使某些在数学上明显成立的现实,在程序中就不一定成立。 例如,在数学上乘法符合交换律,例如,在数学上乘法符合交换律, a*f(x) 与与 f(x)*a显然相等。但是在程序中,假设函数显然相等。

21、但是在程序中,假设函数f改动全局量改动全局量a的值,那么上述交换律的值,那么上述交换律就不成立。就不成立。 设有函数:设有函数: float f(float u) a = a*2; return 2*u 假定,计算时开场假定,计算时开场 a=3 , x=5 ; 3a :5x :当双目运算符的运算对象从左向右计算时,计算:当双目运算符的运算对象从左向右计算时,计算: a * f(x)第一步,求运算分量第一步,求运算分量 a 的值,为的值,为 3 ;第二步,求运算分量第二步,求运算分量 f(x) 的值,调用函数的值,调用函数 f,u 取取 x 值为值为 5 ,进入,进入 f 执行执行 a=a*2

22、a 得得 6,再执行,再执行 return 2*u 得函数值为得函数值为10,前往;,前往;第三步,计算表达式值为第三步,计算表达式值为 3*10 得得 30 。第一运算分量第一运算分量 第二运算分量第二运算分量* *35u :610而在同样条件下计算:而在同样条件下计算: f(x) * a106第一步,求运算分量第一步,求运算分量 f(x) 的值,调用函数的值,调用函数 f,u 取取 x 值为值为 5,进入,进入f执行执行 a=a * 2 a 得得 6 ,再执行,再执行 return 2 * u 得函数值为得函数值为 10 ,前往;,前往;第二步,求运算分量第二步,求运算分量a的值,为的值,

23、为6 ;第三步,计算表达式值为第三步,计算表达式值为10*6得得60 。 计算结果显然不一样,使乘法交换率不成立。这就是由于计算结果显然不一样,使乘法交换率不成立。这就是由于副作用的影响呵斥的,由于在函数副作用的影响呵斥的,由于在函数 f 内改动了全局量内改动了全局量 a 的值。的值。希望读者在编程序时,尽量不要运用带副作用的函数希望读者在编程序时,尽量不要运用带副作用的函数 a = a op b 等价。等价。 例如,设例如,设 x=3 那么那么 x += x*5 ; 相当于相当于 x = x+(x*5) ; 结果结果 x 中为整数中为整数 18 。先计算先计算 “x=0.5 给给 x 赋值赋

24、值 0.5 ,得,得 float 类型的类型的 0.5;再计算再计算 “y=10 给给 y 赋值赋值 10 ,得,得 int 类型的类型的 10 ;再计算再计算 “15+x ,得,得 float 类型的类型的 15.5 ;再计算再计算 “y=(int)x+y*2 给给 y 赋值赋值 20 ,得,得 int 类型的类型的 20 ;最终括号内表达式的结果值是最终括号内表达式的结果值是 20 ,结果类型是整数类型,结果类型是整数类型,j 被被赋值赋值 20 。为为“操作数操作数3的值。的值。条件表达式是右结合的,优先级别高于赋值运算符,低于二条件表达式是右结合的,优先级别高于赋值运算符,低于二元操作

25、符。元操作符。记号记号运算符运算符类别类别结合关系结合关系优先级优先级按位取反按位取反一元一元从右到左从右到左15左移、右移左移、右移二元二元从左到右从左到右11&按位与按位与8按位异或按位异或7|按位或按位或6X 结果的二进制表示为结果的二进制表示为 0000111100001111十六进制的表示为十六进制的表示为 OX0F0F按运算符的要求把按运算符的要求把 “操作数操作数1 挪动挪动 “操作数操作数2 指定指定的位数。在进展移位运算过程中,移到边境之外的多余位的位数。在进展移位运算过程中,移到边境之外的多余位放弃扔掉;另一侧产生的缺位以放弃扔掉;另一侧产生的缺位以“0补足。补足。

26、X5的结果的结果:0110100111100000(X2:0001101001111000(x2X:0001101101001111X5:0110100111100000X 5舍掉舍掉补补0舍掉舍掉补补0 位逻辑运算符以及它定义的操作位逻辑运算符以及它定义的操作Xyx & y(按位与)(按位与)x y(按位异或)(按位异或)x | y(按位或)(按位或)00000010111001111101 【例【例13.8】设整数】设整数x值为值为0 x1B4F,y值为值为0 x1A78,它们,它们按位逻辑运算结果如图按位逻辑运算结果如图.x:00011011010011110 x1B4F x:0

27、0011010011110000X1A78 x&y00011010010010000X1A48 xy00000001001101110X0137 x|y00011011011111110X1B7F x与与y的按位运算的按位运算 printf(Looping ); x;if (x = 5) break; else其他代码其他代码后续代码后续代码int x=0 ;后续代码后续代码x10Fprintf(Looping );x + ;x=5其他代码其他代码T 在该程序片段中,循环将在在该程序片段中,循环将在x=5时停顿,时停顿,去执行后续代码,虽然循环控制当去执行后续代码,虽然循环控制当 x1

28、0 时都执行循环体。用流程图来表示该程序时都执行循环体。用流程图来表示该程序片段如上图。片段如上图。switch (x) case 1: printf(“ 1 ”); case 2: printf(“ 2 ”); case 3: printf(“ 3 ”); default: printf(“no_meaning”);switch (x) case 1: printf(“ 1 ”); break; case 2: printf(“ 2 ”); break; case 3: printf(“ 3 ”); break; default: printf(“no_meaning”); switch 语

29、句中使用语句中使用 break 之一之一 switch 语句中使用语句中使用 break 之二之二 留意留意break在在switch语句中的作用。如下两段代码执行的结果是不语句中的作用。如下两段代码执行的结果是不一样的,请仔细领会。一样的,请仔细领会。1) 在左端程序中,当在左端程序中,当x=2时,打印结果为时,打印结果为: 2 3 no_meaning 由于由于 switch 语句将控制转移到语句将控制转移到 case 2 处打印处打印 2 之后,接着执行之后,接着执行 printf(“ 3 ) 和和 printf(“ no_meaning )。假设需求在每次调用假设需求在每次调用 pri

30、ntf 之后都终止之后都终止 switch 体,那么要象右端一样体,那么要象右端一样 运用运用 break 语句。在右端程序片段中,当语句。在右端程序片段中,当 x=2 时,执行结果只打印时,执行结果只打印 出一个数字出一个数字2。【例【例13.10】continue语句例如语句例如for ( x = 0 ; x 5 ; x)if( x = 2) continue; else printf(Looping %dn,x); 该程序不能够打印该程序不能够打印Looping 2 ,程序执行流程如右图程序执行流程如右图.程序执行结果程序执行结果:Looping 0Looping 1Looping 3L

31、ooping 4int x=0 ;x5Fprintf(Looping %dn,x);x + ;x=2Tcontinue对循环的影响对循环的影响T char *t1, *t2; for ( t1 = str1 , t2 = str2 ; *t1 & *t2 ; t1+ ,t2+ ) if ( *t1 != *t2 ) return false; return *t1 = *t2;开场开场X0=初值初值X1 = f(X0)X0X1终了终了x0=x1TF x0=0.9; x0=0.9; / /* * 1 1 * */ / r1:x1=f(x0); /r1:x1=f(x0); /* * 2 2

32、 * */ / if ( abs(x1-x0)1e-5 )/ if ( abs(x1-x0)1e-5 )/* * 3 3 * */ / goto r2 ; /goto r2 ; /* * 4 4 * */ / x0=x1; x0=x1; / /* * 5 5 * */ / goto r1; goto r1; / /* * 6 6 * */ / r2: ; r2: ; / /* * 7 7 * */ / 当第当第3 3行的条件为行的条件为truetrue时,执行第时,执行第4 4行的行的gotogoto语句,那么转到标号语句,那么转到标号r2r2标出的标出的第第7 7行去执行,从而终了迭代过程。

33、行去执行,从而终了迭代过程。 当程序执行到第当程序执行到第6 6行的行的gotogoto语句后,那么无条件强迫控制转到标号语句后,那么无条件强迫控制转到标号r1r1标出标出的第的第2 2行去执行,继续进展迭代。行去执行,继续进展迭代。指针常量指针常量指针常量指针常量这些是数组这些是数组a的成分,全部是变量的成分,全部是变量aa0a00a01a0n-1a1a10a11a1 n-1am-2am-20 am-21 am-2 n-1am-1am-10 am-11 am-1 n-1实践上,不存在实践上,不存在 a、a0、a1、 、am-1 的存储空间,的存储空间,C 系统不给它们分配内存,只分配系统不给

34、它们分配内存,只分配 m*n 个变量的内存空间。以个变量的内存空间。以下图是一个表示图,给出的下图是一个表示图,给出的a、a0、a1、 、am-1只是只是一个表示,读者不要误解。现实上一个表示,读者不要误解。现实上a、a0、a1、a2、 、am-1都是指针常量。都是指针常量。进一步,进一步,ai是是a数组第数组第i个元素。个元素。假设假设a是一维数组,那么是一维数组,那么ai是一个变量并且可以有值,是一个变量并且可以有值,C系统系统会给它分配相应的存储空间,它实真实在占用计算机内存会给它分配相应的存储空间,它实真实在占用计算机内存假设假设a是二维数组,那么是二维数组,那么ai代表一维数组,它是

35、一个指针常代表一维数组,它是一个指针常量,量,C系统不给它分配存储区,它不占用内存空间,仅仅是系统不给它分配存储区,它不占用内存空间,仅仅是一个地址。一个地址。 指针常量指针常量指针常量指针常量形式形式意义意义a二维数组名,指向一维数组二维数组名,指向一维数组a0,即第,即第0行首地址。行首地址。相当于:相当于:&(a0)也可以说是数组也可以说是数组a的首地址,指向的首地址,指向a00。相当于:相当于:&(a00)a+i第第i行首地址,即行首地址,即ai地址。相当于:地址。相当于:&(ai)。*a第第0行第行第0列元素首地址,即列元素首地址,即a00地址。地址。相当于:

36、相当于:a0、*(a+0) 、&( a00)*a+i第第0行第行第i列元素首地址,即列元素首地址,即a0i地址。地址。相当于:相当于:a0+i、&( a0i)*(a+i)第第i行第行第0列元素地址,即列元素地址,即ai0地址。地址。相当于:相当于:ai 、&( ai0)*(a+i)+j第第i行第行第j列元素地址,即列元素地址,即aij地址。地址。相当于:相当于:ai+j、&( aij)*(*(a+i)+j)第第i行第行第j列元素值,即列元素值,即aij值。值。相当于:相当于:*(ai+j)、aij在该表的各种表示方式中,只需在该表的各种表示方式中,只需&

37、(aij) 、ai+j 、*(a+i)+j 是实践计算机内存的物是实践计算机内存的物理地址理地址aij 、*(ai+j) 、*(*(a+i)+j) 是它们各自的值,占是它们各自的值,占用计算机内存;用计算机内存; 其它方式都是表示地址的指针常量,没有被分配其它方式都是表示地址的指针常量,没有被分配详细内存空间。例如,并不存在详细内存空间。例如,并不存在 ai 这样一个实践的这样一个实践的变量,它只是一个指针常量,运算变量,它只是一个指针常量,运算“&(ai)只是一只是一种地址计算方式而已,并不是求内存实践存在的变量种地址计算方式而已,并不是求内存实践存在的变量ai的内存地址。的内存地址

38、。a成分成分地址地址内存内存a23A016a22A014a21A012a20A010a13A00Ea12A00Ca11A00Aa10A008a03A006a02A004a01A002a00A000a成分成分地址地址内存内存a23A016a22A014a21A012a20A010a13A00Ea12A00Ca11A00Aa10A008a03A006a02A004a01A002a00A000a成分成分地址地址内存内存a23A016a22A014a21A012a20A010a13A00Ea12A00Ca11A00Aa10A008a03A006a02A004a01A002a00A000假设再思索每个元

39、素占用的内存假设再思索每个元素占用的内存尺寸,尺寸,2*4+1 还要乘以还要乘以 int 类型类型一个变量占用内存空间数一个变量占用内存空间数 2 ,最,最后后 a21 对应的详细内存地址对应的详细内存地址是:是:A000 + (2*4+1)*2为为A012 。当然,在用户程序中只需写地址当然,在用户程序中只需写地址计算公式计算公式“aptr+u*n+v即可即可.没有必要也不允许思索每个元素没有必要也不允许思索每个元素占用的存储空间尺寸。占用的存储空间尺寸。没有必要,也不允许,更不能够没有必要,也不允许,更不能够写出详细的地址计算计算算式写出详细的地址计算计算算式“A000 + (2*4+1)

40、*2。 float arrmul(int m , int n , float *arr) int u, v; float mul; mul = 1; for( u=0; um; u+) for( v=0; vb) return a; else return b;在该程序中,源文件在该程序中,源文件 max.c 中中声明函数声明函数 max ;源文件;源文件 main.c 中调用函数中调用函数max 。max 的函数原型声明被指定为的函数原型声明被指定为 extern 类别的,保证了在源文类别的,保证了在源文件件 main.c 中调用的中调用的 max 就是就是在在 max.c 中定义的函数中定

41、义的函数max ,并且不发生声明冲突。并且不发生声明冲突。 IA ia; /* ia是一个长度为是一个长度为5的一维整型数组的一维整型数组 */ IA ia22; /* ia2是一个是一个2行行5列的二维整型数组列的二维整型数组 */ BP是布尔型指针类型是布尔型指针类型IFP是指向前往值为整型的函数的指针类型是指向前往值为整型的函数的指针类型 IF2I是有两个整型参数且前往整型值的函数类型是有两个整型参数且前往整型值的函数类型IA是长度为是长度为5的一维整型数组类型的一维整型数组类型件包含命令将其括入。这样既可防止在每个文件开头都去书写件包含命令将其括入。这样既可防止在每个文件开头都去书写那些公用量,节省时间,又可防止书写手误,减少出错。那些公用量,节省时间,又可防止书写手误,减少出错。尖括号和双引号区别:尖

温馨提示

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

评论

0/150

提交评论