#include <stdio.h>
void printaddr(int n)
{
printf("%p", &n);
}
int main()
{
int n;
scanf("%d",&n);
printf("%p \n", &n);
printaddr(n);
}
主循环中变量n的地址打印:0028FF0C,而在printaddr函数中打印0028FEF0。
我想知道为什么地址有差异以及这种差异是否代表什么?
答案 0 :(得分:5)
地址不同,因为它们是两个不同的变量。
调用函数时,函数参数将使用函数参数值的副本进行初始化。如果您在n
内更改了printaddr
,则不会影响n
内main
的值。
答案 1 :(得分:2)
因为在
void printaddr(int n)
您正在创建一个具有不同地址的新本地变量n
(函数的本地变量)。
您可以使用像
这样的指针void printaddr(int *n)
并将其命名为
printaddr(&n);
因此,如果您将代码更改为
#include<stdio.h>
void printaddr(int *n)
{
printf("%p", n);
}
int main()
{
int n;
scanf("%d",&n);
printf("%p \n", &n);
printaddr(&n);
}
您将获得相同的地址。 (但请注意,函数内的n
只会指向来自n
的{{1}}的地址,它与地址不同;
答案 2 :(得分:2)
该函数获取变量的副本,因为传值值语义。所以,它实际上是一个不同的变量。地址不同,因为内存不同。
作为测试,请尝试更改n
中的printaddr
,并查看它是否在main
中发生变化。提示,它不会。
如果要访问同一块内存,可以将指针传递给函数。
答案 3 :(得分:2)
扩展Arun A.S提到的内容:
您正在调用该函数:
void printaddr(int n)
并且您的调用者正在传递n
(按值)而不是&n
(地址为n),因此您传递的是值而不是引用。
当您通过值传递时,该值将本地复制到函数,因此原始值不会更改。
函数完成后,除非返回值,否则将销毁n的本地副本。
这就是为什么如果你在同一个函数中更改n
的值(不返回值),当你从main访问变量n
时,它将不是相同的值。