c - 为什么变量的地址在传递函数后会改变

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

我不明白为什么地址会改变,以及如何创建一个函数来查找地址并允许我在主函数中将它们打印出来?

最佳答案

在函数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);
    }
}

关于c - 为什么变量的地址在传递函数后会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57947668/

相关文章:

进行公差分析的代码

c++ - 10 个字符字符串到 Arduino 上的 int

c - 如何在C程序中获取当前目录?

java - 如何检查日期数组与今天的日期是连续的?

html - 如何在 html 模板中生成项目数组以在 Node Js 中创建 pdf?

c - 更新指针值会更新它指向的内容吗?

java - 如何检查数组中是否有重复的数字?

c++ - 2个数组相乘的函数

javascript - 需要使用javascript在文本框中显示加法结果

algorithm - 关于遗传算法