我需要使用指针找到数组中的最小和最大数字;除此之外,我还需要在主函数中输出这些数字的地址。
我正在努力解决的问题是找到号码的地址。问题是同一个号码有不同的地址。为什么会这样?
这是我得到的输出:
Please enter a value 0 - 4
Please enter a value 1 - 7
Please enter a value 2 - 2
0x7ffeefbff4fc,4
0x7ffeefbff500,7
0x7ffeefbff504,2
The min value is: 2
The max value is: 7
and address 0x7ffeefbff4f0
#define size 3
void Input (int arr[]);
void AdressOutput (int arr[]);
void MinAndMax (int arr[],int *min,int *max);
int main(void)
{
int arr[size];
int min=0,max=0;
Input(arr);
AdressOutput(arr);
MinAndMax(arr,&min,&max);
printf ("The min value is: %d\n",min);
printf ("The max value is: %d\n and address %p\n",max,&max);
return 0;
}
void Input (int arr[])
{
int i;
int *p=arr;
for (i=0;i<size;i++)
{
printf ("Please enter a value %d - ",i);
scanf ("%d",(p+i));
}
printf ("\n");
}
void AdressOutput (int arr[])
{
int i=0;
int *p=arr;
for (i=0;i<size;i++)
{
printf ("%p,%d\n",(p+i),*(p+i));
}
}
void MinAndMax (int arr[],int *min,int *max)
{
int i=0;
int *p;
p=arr;
*min=*p;
*max=*p;
for (i=0;i<size;i++)
{
if(*(p+i)>*max) //finding max
*max=*(p+i);
}
for (i=0;i<size;i++)
{
if(*(p+i)<*min)//finding min
*min=*(p+i);
}
}
我不明白为什么地址会改变,以及如何创建一个函数来查找地址并允许我在主函数中将它们打印出来?
最佳答案
在函数MinAndMax
中,arr
是你的输入参数(给函数输入的参数),max
和min
是输出参数(赋予函数用于存储输出的参数)。该函数将从输出参数获取存储输出的地址。输出参数始终是地址,即这些参数中的值指向您最终要存储输出的内存。
你想存储什么?您想要存储一个 int
还是想要一个指向 int
你想打印最小值和最大值的地址,所以你想存储指向 int 的地址
在main
函数中,您声明了int min=0,max=0;
,这些不能存储地址,只能存储int
.因此,让我们将其更改为 int *min_address, *max_address;
您已将函数 MinAndMax 声明为 void MinAndMax (int arr[],int *min,int *max);
。对于参数 min
和 max
这意味着指向 int 的地址。
但是由于您想要存储地址,所以您在函数中想要的是:存储指向 int 的地址的内存单元的地址。换句话说,你想要一个双指针。因此,让我们将函数声明更改为 void MinAndMax (int arr[], int **min_address, int **max_address);
这是更正后的代码:
#include<stdio.h>
#define size 3
void Input (int arr[]);
void AdressOutput (int arr[]);
void MinAndMax (int arr[], int **min_address, int **max_address);
int main(void)
{
int arr[size];
int *min_address, *max_address;
Input(arr);
AdressOutput(arr);
MinAndMax(arr, &min_address, &max_address);
printf("The min value is: %d\n and adress %p\n", *min_address, min_address);
printf("The max value is: %d\n and adress %p\n", *max_address, max_address);
return 0;
}
void Input (int arr[])
{
int i;
int *p=arr;
for (i=0;i<size;i++)
{
printf("Please enter a value %d - ",i);
scanf("%d",(p+i));
}
printf ("\n");
}
void AdressOutput (int arr[])
{
int i=0;
int *p=arr;
for (i=0;i<size;i++)
{
printf("%p,%d\n",(p+i),*(p+i));
}
}
void MinAndMax (int arr[], int **min_address, int **max_address)
{
int i=0;
int *p;
p=arr;
*min_address=p;
*max_address=p;
for (i=0;i<size;i++)
{
if(*(p+i)>**max_address) //finding max
*max_address=(p+i);
}
for (i=0;i<size;i++)
{
if(*(p+i)<**min_address) //finding min
*min_address=(p+i);
}
}
关于c - 为什么变量的地址在传递函数后会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57947668/