首页 > 解决方案 > 为什么传递函数后变量的地址会发生变化

问题描述

我需要使用指针找到数组中的最小和最大数;除此之外,我还需要在main函数中输出这些数字的地址。

我正在努力的部分是找到号码的地址。问题是同一个号码有不同的地址。为什么会这样?

这就是我得到的输出:

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);
    }
}

我不明白为什么地址会发生变化,以及如何创建一个可以找到地址并允许我在主函数中打印出来的函数?

标签: carraysfunctionpointers

解决方案


在函数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);. 对于参数minmax这意味着指向 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);
    }
}

推荐阅读