【问题标题】:Why address of the variable changes after passing the function为什么传递函数后变量的地址会发生变化
【发布时间】:2019-09-15 19:47:06
【问题描述】:

我需要使用指针在数组中找到最小和最大的数;除此之外,我还需要在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);
    }
}

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

【问题讨论】:

  • 地址没有变化,max 是一个与arr 完全不同的变量,所以它显然有不同的地址
  • AdressOutput中输出arr元素的地址,然后输出max的地址。两者都是存储在不同内存地址的独立变量。你不会期望它们是一样的。
  • @DavidC.Rankin 对,搞砸了,谢谢
  • 别担心,这都叫学习,我们一开始都不知道......

标签: c arrays function pointers


【解决方案1】:

在函数中MinAndMaxarr是你的输入参数(给函数输入的参数),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);
    }
}

【讨论】:

  • 您可以一次性对数据进行最小/最大搜索,如果数组大于 3,这很重要。您也可以从索引 1 开始搜索循环; min 和 max 的初始值是索引 0 处的值。最后,'address' 有两个英文的 d — 继承自问题的问题。
  • 非常感谢,非常有帮助!只是一个愚蠢的问题,如果我这样声明有区别吗 *min_address=p;或者像这样 p=*min_address;?
  • 当然有区别。在*min_address=p 中,您存储p 值,即arr 中的第一个元素的地址,在*min_address 中,即min_address 值指向的地址。而p=*min_address 将垃圾地址存储在 p 中,因为min_address 未初始化
猜你喜欢
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2016-01-06
相关资源
最近更新 更多