为什么在传递函数后变量的地址发生变化

时间:2019-09-15 19:47:06

标签: c arrays function pointers

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

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

这是我得到的输出:

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

我不明白为什么地址会更改,以及如何创建一个可以找到地址并允许我在主功能中将其打印出来的函数?

1 个答案:

答案 0 :(得分:2)

函数MinAndMax中的arr是您的输入参数(为输入提供给函数的参数),而maxmin是您的输入参数(给函数提供的参数用于存储输出)。该函数将从输出参数中获取存储输出的地址。输出参数始终是地址,即这些参数中的值指向最终要存储输出的内存。

您要存储什么?您要存储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);
    }
}