【例8-9】题目同【例8.7】 。改用数组名作函数参数 。#include stdio.hvoid nzp(int a[5]){int i;printf("\nvalues of array a are:\n");for(i=0;i5;i++){if(a[i]0) a[i]=0;printf("%d ",a[i]);}}int main(void){int b[5],i;printf("\ninput 5 numbers:\n");for(i=0;i5;i++)scanf("%d",b[i]);printf("initial values of array b are:\n");for(i=0;i5;i++)printf("%d ",b[i]);nzp(b);printf("\nlast values of array b are:\n");for(i=0;i5;i++)printf("%d ",b[i]);return 0;}
本程序中函数nzp的形参为整数组a,长度为5 。主函数中实参数组b也为整型,长度也为5 。在主函数中首先输入数组b的值,然后输出数组b的初始值 。然后以数组名b为实参调用nzp函数 。在nzp中,按要求把负值单元清0,并输出形参数组a的值 。返回主函数之后,再次输出数组b的值 。从运行结果可以看出,数组b的初值和终值是不同的 , 数组b的终值和数组a是相同的 。这说明实参形参为同一数组,它们的值同时得以改变 。
用数组名作为函数参数时还应注意以下几点:
①形参数组和实参数组的类型必须一致,否则将引起错误 。
②形参数组和实参数组的长度可以不相同,因为在调用时,只传送首地址而不检查形参数组的长度 。当形参数组的长度与实参数组不一致时 , 虽不至于出现语法错误(编译能通过),但程序执行结果将与实际不符,这是应予以注意的 。
【例8.10】如把例8.9修改如下:#include stdio.hvoid nzp(int a[8]){int i;printf("\nvalues of array aare:\n");for(i=0;i8;i++){if(a[i]0)a[i]=0;printf("%d ",a[i]);}}int main(void){int b[5],i;printf("\ninput 5 numbers:\n");for(i=0;i5;i++)scanf("%d",b[i]);printf("initial values of array b are:\n");for(i=0;i5;i++)printf("%d ",b[i]);nzp(b);printf("\nlast values of array b are:\n");for(i=0;i5;i++)printf("%d ",b[i]);return 0;}
本程序与【例8.9】程序比 , nzp函数的形参数组长度改为8,函数体中,for语句的循环条件也改为i8 。因此,形参数组a和实参数组b的长度不一致 。编译能够通过,但从结果看,数组a的元素a[5]、a[6]、a[7]显然是无意义的 。
③在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数 。例如,可以写为:
void nzp(int a[])
或写为
void nzp( int a[], int n )
其中形参数组a没有给出长度,而由n值动态地表示数组的长度 。n的值由主调函数的实参进行传送 。由此,【例8-10】又可改为【例8-11】的形式 。
【例8-11】复制纯文本新窗口
#include stdio.hvoid nzp(int a[],int n){int i;printf("\nvalues of array a are:\n");for(i=0;in;i++){if(a[i]0) a[i]=0;printf("%d ",a[i]);}}int main(void){int b[5],i;printf("\ninput 5 numbers:\n");for(i=0;i5;i++)scanf("%d",b[i]);printf("initial values of array b are:\n");for(i=0;i5;i++)printf("%d ",b[i]);nzp(b,5);printf("\nlast values of array b are:\n");for(i=0;i5;i++)printf("%d ",b[i]);return 0;}
c语言向函数传递函数作为参数#include stdio.h
//---子函数声明---//
int func1();
int func2(int (*func1)());//形参为函数指针(即指向函数c语言用函数做参数的指针)
//---主函数---//
int main(){
printf("向函数二传递函数一c语言用函数做参数,\n即函数一作为函数二c语言用函数做参数的参数 。\n");
printf("%d ",func1());
printf("%d\n",func2(func1));//注意函数名即为函数地址c语言用函数做参数!c语言用函数做参数?。。。。?
}//实参为函数名func1或者func1,两者等价 , 而非func1()
//---子函数定义---//
int func1(){
return 1;
}
int func2(int (*func1)()){//形参为函数指针(即指向函数的指针)
return func1()+1;
}
C语言函数参数汇编代码gcc:
第一个问题的汇编:
推荐阅读
- 河南快手哪个直播最好挣钱,河南快手红人都有谁
- 公众号发表哪些文章,公众号发表哪些文章好
- 魅族怎么用鸿蒙系统,魅族手机怎么装鸿蒙系统
- 王者云果果在哪里直播卖货,王者果果
- python起进程函数 python 进程pid
- java自动清屏代码,java 清空屏幕
- word如何导出语音,导出word朗读音频
- 单机游戏恋爱养成推荐,单机恋爱养成类手游
- mysql怎么输出数据库 mysql输出数据库中所有表