c语言指针做函数参数

#include <stdio.h>
float fun(int a[],int n,int *max,int *min);
int main()
{
int x[10],i,m,n;
float p;
for(i=0;i<10;i++)
  scanf("%d",&x[i]);
p=fun(x,10,&m,&n);
printf("max=%d,min=%d,average=%.2f\n",m,n,p);
return 0;
}
float fun(int a[],int n,int *max,int *min){
    int i = 0;
    float sum = 0;
    *max = a[0]; // max = &a[0]
    *min = a[0];  //min = &a[0];
    for (i = 0; i < n; i++){
        sum += a[i];
        if (a[i] > *max){
            *max = a[i];
        }
        if (a[i] < *min){
            *min = a[i];
        }
    }
    return sum / n;

}

2 5 4 8 6 9 1 3 7 0
max=9,min=0,average=4.50

Process returned 0 (0x0)   execution time : 6.525 s
Press any key to continue.

 

#include <stdio.h>
float fun(int a[],int n,int *max,int *min);
int main()
{
int x[10],i,m,n;
float p;
for(i=0;i<10;i++)
  scanf("%d",&x[i]);
p=fun(x,10,&m,&n);
printf("max=%d,min=%d,average=%.2f\n",m,n,p);
return 0;
}
float fun(int a[],int n,int *max,int *min){
    int i = 0;
    float sum = 0;
    max = &a[0]
    min = &a[0];
    for (i = 0; i < n; i++){
        sum += a[i];
        if (a[i] > *max){
            max = &a[i];
        }
        if (a[i] < *min){
            min = &a[i];
        }
    }
    return sum / n;

}

结果:

2 5 4 8 6 9 1 3 7 0
max=6356940,min=6356712,average=4.50

Process returned 0 (0x0)   execution time : 1.533 s
Press any key to continue.


 上面两端程序中,不同的地方为第一个为 *max= a[0]; *min = a[0],*max = *a[i],*min= *a[i];

第二个为:min = &a[0],min = &a[0],max = &a[i],min= &a[i];

但是输出结果却不同

第一个为正确结果,因为第二个中,min的值都是地址,在主程序中%d输出,输出的就是min的值,即为地址

*min是修改min地址中的内容,而不是改变地址,本题要求的就是修改原变量的内容,而不是修改地址

可以这样理解形参中的第三、第四个参数都是指针,但他们的作用是指向主函数中的某个变量,在自定义函数中要把*min和*min都当做是int 型的整数来对待

 

#include <stdio.h>
int main(){
    int var1 = 10;
    int var2 = 20;
    swap(&var1, &var2);
    printf("var1=%d,var2=%d",var1,var2);
}
void swap(int *pvar1, int *pvar2){
    int temp = *pvar1;
    *pvar1 = &pvar2;
    *pvar2 = temp;
}


var1=0000000A,var2=00000014
var1=20,var2=10
交换后两个数的地址var1=00000014,var2=0000000A

Process returned 0 (0x0)   execution time : 0.470 s
Press any key to continue.





void swap(int *pvar1, int *pvar2){
    int temp = pvar1;
    pvar1 = pvar2;
    pvar2 = temp;
}
var1=0000000A,var2=00000014
var1=10,var2=20
交换后两个数的地址var1=0000000A,var2=00000014

Process returned 0 (0x0)   execution time : 0.330 s
Press any key to continue.






这是交换两个数的程序,交换前和交换后,var1和var2的地址交换了,并不是只是交换地址中的内容,

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值