2 wolfie wolfie_ 于 2016.05.02 19:24 提问

C语言指针在这个函数里发生了怎样的变化? 5C

从键盘任意输入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
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 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 {
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在函数中到底发生了怎样的变化,为什么我运行出来的结果如下图?求大神帮忙把我的程序改错,让指针能够顺利地指向下标并在主函数里顺利地输出正确结果
图片说明

5个回答

CSDNXIAOD
CSDNXIAOD   2016.05.02 19:31

指向函数的指针 - C语言
C语言/函数指针
指向函数的指针(续) - C语言
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

iPINGyou
iPINGyou   2016.05.02 20:26

你只需要把main里面改一下就行了:
//FindMax(a,x,ptr1);
//FindMin(a,y,ptr2);
printf("%d",FindMax(a,x,ptr1););
printf("\n%d",FindMin(a,y,ptr2););

上面只是针对要输出你的答案,需要改的地方还很多。

iPINGyou
iPINGyou   2016.05.02 20:45

//你的程序虽然能出结果。但很多地方错了。
#include

int FindMax(int num[],int n, int *pMaxPos);
int FindMin(int num[],int n,int *pMinPos);

int main(void)
{
int maxPos;
int minPos;
int i;
int a[10];

printf("Input 10 numbers:\n");

for(i=0;i<10;i++)
    scanf("%d",&a[i]);

printf("max:%d\n",FindMax(a,10,&maxPos));
printf("max point to %d\n",maxPos);

printf("min:%d\n",FindMin(a,10,&minPos));
printf("min point to %d\n",minPos);

}
int FindMax(int num[],int n, int *pMaxPos)
{
int i;
int t=num[0];
*pMaxPos=0;
for(i=1;i {
if(num[i]>=t)
{
t=num[i];
*pMaxPos=i;
}
}
return t;
}
int FindMin(int num[],int n,int *pMinPos)
{
int i;
int t=num[0];
*pMinPos=0;
for(i=1;i<n;i++)
{
if(num[i]<t)
{
t=num[i];
*pMinPos=i;
}
}
return t;
}

iPINGyou
iPINGyou   2016.05.02 20:52

int *ptr1=a;
int *ptr2=a;
你让ptr1 ptr2指向a 意思就是指向a的第一个元素。 然后你用ptr1 ptr2传到函数里,传的是ptr1 ptr2的一份拷贝, 接着你修改了*ptr1 *ptr2就是修改了a[0]的值。

还有你之所以要传指针,是为了能在main函数里用那两个值(max值和min值的位置)。然后你又在两个函数里面直接输出它们的结果,这样根本就是白用,完全没必要。
你的目的是传入指向maxPos minPos的指针,然后在函数里面修改,然后修改后的值能在main中使用。所以你传的对象就不对!!!(你传的是ptr1=a;ptr2=a)

wolfie_
wolfie_ 哦哦,我懂了,谢谢
一年多之前 回复
iPINGyou
iPINGyou 你以后还会学到指向指针的指针 等等一些东西。
一年多之前 回复
iPINGyou
iPINGyou 你想指向下标,你可以在main函数定义一个变量来存储哇。比如 int maxPos; int *ptr1=&maxPos; 而不是让一个指针去指向a[0],你这样的话修改就变成修改a[0]了。 还有你要明白pMaxPos只是ptr的拷贝,它们是两个不同的指针,但都指向一个值a[0]。
一年多之前 回复
iPINGyou
iPINGyou 回复wolfie_: pMaxPos是ptr的一份拷贝(两个不同的变量,但它们都指向a[0])。 你修改*pMaxPos修改的是a[0]的值。你输出*ptr1 *ptr2 *pMaxPos都是输出a[0]的值。 至于为什么a[0]变成了1:首先你调用了FindMax,找到最大值是92,且这时*pMaxPos等于4,即a[0]被你改成4。此时数组变成:4 2 3 4 5 92 8 9 12 18. 接着,你调用FindMin此时找到的最小值是2,你把*pMinPos改成1. 此时a[0]被你改成1了。。 所以 最后你输出*ptr1 *ptr2都是输出a[0]的值 即1
一年多之前 回复
wolfie_
wolfie_ 回复wolfie_: 如果我想指向下标的话我该怎么做呢?那个指针总得指向个什么东西吧...我只定义了一个数组呀...
一年多之前 回复
wolfie_
wolfie_ 回复wolfie_: 我在find函数里和main函数里分别调用的目的是找出他们的差别好找到问题出在哪里
一年多之前 回复
wolfie_
wolfie_ 谢谢你的耐心解答,我知道我修改了a[0]的值,但是为什么我输出的*MaxPos的值和*ptr的值不一样呢?按理说*pMaxPos已经指向了i那么他的值就是4了,为什么我输出*ptr1的时候是1呢?
一年多之前 回复
iPINGyou
iPINGyou   2016.05.02 21:02

如果哪里不懂可以来问。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!