c - 为什么传递函数后变量的地址会发生变化
问题描述
我需要使用指针找到数组中的最小和最大数;除此之外,我还需要在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);
}
}
我不明白为什么地址会发生变化,以及如何创建一个可以找到地址并允许我在主函数中打印出来的函数?
解决方案
在函数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);
}
}
推荐阅读
- java - 打印对应的数组索引
- ubuntu - 从 Ubuntu 18.04 构建并安装了 ubuntu-desktop 的 EC2 AMI 无法访问
- excel - 循环遍历图表并更改标签(类别名称)
- context-free-grammar - Describe the language generated by this context-free grammar
- webpack - 是否可以只使用 html-webpack-plugin 而不是样板来生成脚本标签?
- python - Detecting sections of a pdf with pdfminer
- java - 随机字节到 int java
- go - Break out of loop when no channel in a select group receives signal in specified time
- javascript - Trying to recreate indexOf method in JavaScript
- bash - 如何将变量输入到 bash 命令中以内联运行?调试 bash ctrlZ?