C,形参与实参的问题

时间:2022-08-29 20:15:01
先问个基础的东西 
比如有这样一个函数  comp(int *p,int *q)
main(){
int a=3,b=4;
comp(a,b);
}
这里的实参a,b能就这样传过去吗??? 还是必须传地址过去??? 改成comp(&a,&b);

在c语言中怎样使形参值改变实参值也跟着改变必须改成指针,下面的这个程序:

#include <stdio.h>
#define N 10 //N在下列各个函数内的数值都是10,是不变的。
float psalary;  
struct st
{int num;
 char name[20],birth[20];
 float salary;
 };
void input1(struct st a[])
{int i;
for(i=0;i<N;i++)
scanf("%d%s%s%f",&a[i].num,a[i].name,&a[i].birth,&a[i].salary);
}
void pj(struct st b[])
{ int i;
 float zsalary=0;
 for(i=0;i<N;i++)
zsalary=zsalary+b[i].salary;
 psalary=zsalary/N;
}
void bijiao(struct st c[])
{ int i,j;
struct st t;
for(i=0;i<N-1;i++)
   for(j=0;j<N-1-i;j++)
     if(c[j].salary<c[j+1].salary) 
 {t=c[j];c[j]=c[j+1];c[j+1]=t;}
}
void output1(struct st d[]) 


printf("最高工资的员工信息:职工号%d,姓名%s,生日%s,工资%.2f\n",d[0].num,d[0].name,d[0].birth,d[0].salary);

void output2(struct st e[])
{int i;
for(i=0;i<N;i++)
printf("职工号%d,姓名%s,生日%s,工资%.2f\n",e[i].num,e[i].name,e[i].birth,e[i].salary);
}
void main()
{ struct st s[N];
 input1(s); //输入10位员工的信息
 printf("\n");
 pj(s);     //求平均工资
 bijiao(s);  //按工资从大到小排序,排序各员工的信息
 printf("平均工资为:%.2f\n",psalary);//输出平均工资
 output1(s); //输出最高工资员工的信息
 printf("\n");
printf("各员工信息:\n"); 
 output2(s);//输出排序后各员工的信息
}

input1(s); 这里传进去是个结构体数组  我想问下这个函数过后,S为什么会是输进去的10组数据?
input1也是VOID 无返回值的,另外这里的S是怎么接收输进来的数据的???? 
或者这个程序就有错?
公司有个新项目是用C,现在得返回去看C了,看到这个有点迷惑。

5 个解决方案

#1


1.还是必须传地址过去??? 改成comp(&a,&b); 
2.input1(s); 这里传进去是个结构体数组  我想问下这个函数过后,S为什么会是输进去的10组数据?
数组做函数参数退化为指针.

#2


额,你确定是这个原因吗?当然不是不信你

#3


.......................我十分的不确定是这个原因.........................

#4


呵呵  查了下摆度 是这样的  分给你了

#5


1、指针做形参时,需要传地址过去。
即:comp(&a,&b); 形式;
2、数组做形参时,实际上跟指针做形参是差不多的。
数组名就是一个特殊的指针,传进去的数组的首地址.

#1


1.还是必须传地址过去??? 改成comp(&a,&b); 
2.input1(s); 这里传进去是个结构体数组  我想问下这个函数过后,S为什么会是输进去的10组数据?
数组做函数参数退化为指针.

#2


额,你确定是这个原因吗?当然不是不信你

#3


.......................我十分的不确定是这个原因.........................

#4


呵呵  查了下摆度 是这样的  分给你了

#5


1、指针做形参时,需要传地址过去。
即:comp(&a,&b); 形式;
2、数组做形参时,实际上跟指针做形参是差不多的。
数组名就是一个特殊的指针,传进去的数组的首地址.