关于指针在函数中变化的问题

从键盘任意输入10个整数,用指针变量作函数参数编程计算最大值和最小值,并返回它们所在数组中的位置。函数原型如下所示:intFindMax(intnum[],intn,in... 从键盘任意输入10个整数,用指针变量作函数参数编程计算最大值和最小值,并返回它们所在数组中的位置。函数原型如下所示:
int FindMax(int num[], int n, int *pMaxPos);//函数返回最大值,pMaxPos返回最大值所在的下标
int FindMin(int num[], int n, int *pMinPos);//函数返回最小值,pMaxPos返回最小值所在的下标
程序运行结果示例:
Input 10 numbers:
-1 2 3 45 92 8 9 12 7 8↙
Max=92,Position=4,Min=-1,Position=0
---------------------------------------------------------------------------题目
我编的程序如下:
#include <stdio.h>
int FindMax(int num[],int n, int *pMaxPos);
int FindMin(int num[],int n,int *pMinPos);
int main(void)
{
int x=10;
int y=10;
int i;
int a[10];
int *ptr1=a;
int *ptr2=a;
printf("Input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
FindMax(a,x,ptr1);
FindMin(a,y,ptr2);
printf("%d",*ptr1);
printf("\n%d",*ptr2);
}
int FindMax(int num[],int n, int *pMaxPos)
{
int j,t1;
t1=num[0];
for(j=1;j<n;j++)
{
if(num[j]>=t1)
{
t1=num[j];
*pMaxPos=j;
}
}
printf("max point to %d\n",*pMaxPos);
return t1;
}
int FindMin(int num[],int n,int *pMinPos)
{
int i,t;
t=num[0];
for(i=1;i<n;i++)
{
if(num[i]<t)
{
t=num[i];
*pMinPos=i;
}
}
printf("min point to %d\n",*pMinPos);
return t;
}
-------------------------------------------------------------------------
并没有按照题目输出的格式,是因为想要搞清楚*pMinPos和*pMinPos在函数中到底发生了怎样的变化,为什么我运行出来的结果如下图?求大神帮忙把我的程序改错,让指针能够顺利地指向下标并在主函数里顺利地输出正确结果
展开
 我来答
tufeididi007
2016-05-02 · TA获得超过2125个赞
知道大有可为答主
回答量:2698
采纳率:76%
帮助的人:1238万
展开全部
//我自己写了一个, 差不多
//大概问题就是ptr = a
//ptr指向数组了, 那么FindMax函数内部的ptr = i就会改变数组a的值
#include <stdio.h>
int FindMax(int num[], int n, int *pMaxPos);
int FindMin(int num[], int n, int *pMinPos);
int main(void)
{
    int a[] = {-1, 2, 3, 45, 92, 8, 9, 12, 7, 8};
    int n, max, min, umax, umin, *pMaxPos, *pMinPos;
    //这里如果单纯只是在函数内部使用*pMaxPos = i会导致改变数组的值
    //(因为之前使用pMaxPos = a), 而不是记录数组下标
    umax = umin = 0;
    //必须初始化0, 否则最小值在头部, 会出现一个随机数(临时变量)
    pMaxPos = &umax;
    pMinPos = &umin;
    //END
    n = sizeof(a) / sizeof(a[0]);
    max = FindMax(a, n, pMaxPos);
    min = FindMin(a, n, pMinPos);
    printf("max = %d, min = %d\n", max, min);
    printf("%d, %d", umax, umin);
}
int FindMax(int num[], int n, int *pMaxPos)
{
    int i, t;
    t = num[0];
    for(i = 0; i < n; i++)
    {
        if(t < num[i])
        {
            t = num[i];
            *pMaxPos = i;
        }
    }
    printf("pMaxPos = %d\n", *pMaxPos);
    return t;
}
int FindMin(int num[], int n, int *pMinPos)
{
    int i, t;
    t = num[0];
    for(i = 0; i < n; i++)
    {
        if(t > num[i])
        {
            t = num[i];
            *pMinPos = i;
        }
    }
    printf("pMinPos = %d\n", *pMinPos);
    return t;
}
育知同创教育
2016-05-02 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
展开全部
参考以下
regFunc((void *)param);
这是通过函数指针调用函数。括号里边的 param 是 test_struct 类型的,所以必须强制转换为 (void*)。

C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。函数指针有两个用途:调用函数和做函数的参数。
赋给函数指针的函数应该和函数指针所指的函数原型是一致的。
指向函数的指针变量没有++和--运算,用时要小心。
函数名相当于一个指向其函数入口指针常量。
可以对函数名进行一些相应的处理,如强制类型转换。

void MyFun(int x);
void (*FunP)(int ); //也可申明成void(*FunP)(int x),但习惯上一般不这样。
int main(int argc, char* argv[])
{
MyFun(10); //这是直接调用MyFun函数

/*FunP=&MyFun;
(*FunP)(20); // right */

/*FunP=MyFun;
FunP(20);// right */

/*FunP=&MyFun;
FunP(20); // right */

/*FunP=MyFun;
(*FunP)(20);// right */

(*MyFun)(10);// right
}
void MyFun(int x) //这里定义一个MyFun函数
{
printf(“%d\n”,x);
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式