我真的很困惑,下面的代码中需要指针的帮助,代码是关于从给定数组中查找最大值和最小值。我知道也可以通过使用结构来解决问题但我想了解指针的使用
#include<stdio.h>
int max2,min2,max,min,maximum,minimum;
int Maxmin(int a[],int *max,int *min,int i,int j)
{
if(i==j)
{
return *max=*min=a[i];
}
else if(i==j-1)
{
if(a[i]<a[j])
{
*max=a[j];
*min=a[i];
}
else
{
*max=a[i];
*min=a[j];
}
}
else
{
int mid=(i+j)/2;
Maxmin(a,max,min,i,mid);
Maxmin(a,&max2,&min2,mid+1,j);
}
if(*max<max2)
{
*max=max2;
}
if(*min>min2)
{
*min=min2;
}
}
int main()
{
int a[]={4,30,2,100,230};
Maxmin(a,&max,&min,0,4);
printf("%d %d",max,min);
}
答案 0 :(得分:2)
在呼叫方:
max
和min
是int变量。
&max
和&min
是这些int变量的内存地址。
从被叫方:
int *max
和int *min
在Maxmin
中被声明为指向int的指针。让我们看一下,好像指针包含一个内存地址。指向int的指针包含一个int变量的内存地址。
*max
和*min
是访问内存地址内容(取消引用指针)的方法。由于您有一个指向int的指针,因此您将从该操作中读取一个int。
此代码的关键是要知道,如果您在*max
内修改*min
或Maxmin
,则将更改max
和{{ 1}},因为您直接使用这些全局变量的内存内容。
答案 1 :(得分:0)
首先,您需要区分*和用于指针的符号以及它们的用法。
*
运算符可以以两种方式使用
*
,可用于定义指针
例如。 int * ptr
这个东西将创建一个指针,并可以存储int类型的地址
*
作为取消引用运算符printf("%d",*ptr);
打印值
指针将存储谁的地址。
例如。 int a = 10;
int *ptr=&a;
printf("%d",*ptr)
;取消引用ans指针的值会将其打印为10
&
仅用作某些变量的地址。
现在,在您的代码中,当您使用*max
和*min
时,它指的是函数max,min中使用的指针的值,该值最终指的是全局变量,因为您已经传递了全局变量的地址在主要功能上
当在函数&max2
和&min2
中使用&时,表示全局变量的地址。
该代码可能给出了错误的输出,因为它比较了可能具有垃圾值的所有四个全局变量的值。因此,最好像这样int max=-10000 ,min=10000 ,min2=10000 ,max2=-10000
来初始化全局变量。这将始终给出正确的输出。