在main和函数中打印时变量地址的差异

时间:2015-04-24 14:50:26

标签: c

#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。

我想知道为什么地址有差异以及这种差异是否代表什么?

4 个答案:

答案 0 :(得分:5)

地址不同,因为它们是两个不同的变量。

调用函数时,函数参数将使用函数参数值的副本进行初始化。如果您在n内更改了printaddr,则不会影响nmain的值。

答案 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时,它将不是相同的值。