1.函数之间参数传递的方式有值传递和地址传递。
2.简述:函数之间两种参数传递方式的区别。
答:在值传递中,实际参数(调用函数时给出的参数)的值被复制到形式参数(函数定义中指定的参数)中。函数内对形式参数的任何修改都不会影响到实际参数的值。
在地址传递中,实际参数的地址被传递给形式参数。形式参数是一个指针,它指向实际参数的值。因此,在函数内部对形式参数(即指针)指向的内存所做的任何修改都会影响到实际参数的值。
3.函数main 有那些参数?各代表什么含义? 假如程序a调用如下所示:a 123写出程序a中main 函数的参数的具体值。
答:main的参数有argc表示命令行参数的个数。argc至少为1,因为第一个参数argv[0]是程序的名称。argv是一个字符指针数组,指向每个命令行参数的字符串。
argc = 2;
argv[0]="a";argv[1]="123";
4.用指针作函数参数,编程序求一维数组中的最大和最小的元素值。
代码展示:
#include <stdio.h> #include <string.h> #include <stdlib.h> int cmpmax(int *a,int n,int *max);//声明函数 int cmpmin(int *a,int n,int *min);//声明函数 int main(int argc, const char *argv[]) { int a[]={11,8,89,7,5,4,32,15,21},max,min;//定义数组,最大值和最小值 int len=sizeof(a)/sizeof(int);//求数组a的尺寸 printf("max=%d\nmin=%d\n",cmpmax(a,len,&max),cmpmin(a,len,&min));//调用定义的最大值和最小值函数 return 0; } int cmpmax(int *a,int n,int *max)//定义函数,这里的max要使用地址传参,使用值传参无法找到最大值 { *max = *a;//将a[0]赋值给max for(int i=0;i<n;i++){ if(*max<*(a+i)){//循环找出最大值 *max = *(a+i);//*(a+i)等价于a[i] } } return *max;//返回最大值 } int cmpmin(int *a,int n,int *min)//定义函数,这里的min要使用地址传参,使用值传参无法找到最大值 { *min=*a; for(int i=0;i<n;i++){ if(*min>*(a+i)){//循环找出最小值 *min=*(a+i); } } return *min; }
执行结果展示:
5.用指针接收函数参数,编程序求二维数组的输入、输出、求最大值
代码展示:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void input(int (*a)[4],int hang,int lie);//以下3行声明函数
void output(int (*a)[4],int hang,int lie);
int cmpmax(int (*a)[4],int hang,int lie,int *max);
int main(int argc, const char *argv[])
{
int a[3][4];
int max;
input(a,3,4);//以下三行调用函数//行可以等于sizof(a)/sizeof(int),列可以用sizeof(a[0])/size(int)表示
output(a,3,4);
printf("max=%d\n",cmpmax(a,3,4,&max));
return 0;
}
void input(int (*a)[4],int hang,int lie)//定义函数
{
printf("请输入%d行%d列的二位数组,用空格隔开:\n",hang,lie);//提示输入命令
for(int i=0;i<hang;i++){
for(int j=0;j<lie;j++){
scanf("%d",*(a+i)+j);//循环输入
}
}
}
void output(int (*a)[4],int hang,int lie)//定义函数
{
printf("输出如下:\n");//提示输出命令
for(int i=0;i<hang;i++){
for(int j=0;j<lie;j++){
printf("%5d ",*(*(a+i)+j));//循环输出
}
printf("\n");
}
}
int cmpmax(int (*a)[4],int hang,int lie,int *max)//定义函数
{
*max=a[0][0];//max初始化为a[0][0]
for(int i=0;i<hang;i++){
for(int j=0;j<lie;j++){
if(*max<*(*(a+i)+j)){//循环找出最大值
*max=*(*(a+i)+j);//*(*(a+i)+j)等价于a[i][j]
}
}
}
return *max;//返回最大值
}
执行结果如下: