如何用函数更改变量的地址?

时间:2017-03-03 19:26:21

标签: c memory-address

我正在尝试使用函数更改某个变量的地址,但我不知道如何做到这一点......不过这是我的去处:

void address (int* x, int* y)
{
    x = y;
}

int main(void)
{
    int x = 2;
    int y = 4;

    address(&x, &y);
    printf("%d", x);

    return 0;
}

3 个答案:

答案 0 :(得分:3)

  

我正在尝试使用函数

更改某个变量的地址

答案是:你做不到。正如评论中所指出的,the address is an abstraction of a physical property。变量在内存中占有空间,只有一个变量可以占用给定的空间(在当今存在的体系结构中)。

如果你想改变两个包含地址的变量的值(也称为pointers)来保存不同的值,你的变量需要被声明为指针,你的函数需要接受指针指针。例如:

void address (int** x, int** y)
{
    *x = *y;
}

int main(void)
{
   int x = 2;
   int y = 4;

   int *px = &x; // px points to x
   int *py = &y; // py points to y

   address(&px, &py);
   printf("%d", px);

   return 0;
}

答案 1 :(得分:2)

我怀疑你想要

void address (int* x, int* y)
{
    *x = *y;
}

即使您的问题的措辞很差。

如果我误解了你真的希望能够改变变量的地址,你就不能。变量的地址不是附加到可以更改的变量的信息。变量的地址是变量。它的名字只是人的便利。

更多回答

main中的x和y是in,例如0x1234和0x1236然后你调用你的函数。碰巧有两个名为x和y的args,这些与main中的x和y并不真正相关。这些args是指向int的指针,包含2个int的地址。在你的情况下主电源'x和y。

我将调用主电源x和y main.x和main.y.我将调用funcs x和y func.x和func.y

所以func.x = 0x1234和func.y = 0x1236。你可以随心所欲地做你喜欢的事,

func.x = func.y 

好的,现在func.x的原始值丢失了,它的值为func.y.两者现在都有main.y的地址。好的,这确实改变了main.x和main.y的任何方面

周围的杂耍指针并没有改变他们指向的东西,它只是让他们指向不同的东西

这样想。在C程序中

int x

意味着分配一个长度为4个字节的变量,并为我记住它的地址,我将该地址称为“x”。在编程的早期阶段(旧的旧汇编程序等),你必须编程说

thing at 0x1234 = 42;
thing at 0x1236 = thing at 0x1234 + 2;

等。 (你实际上说'你在'你有一些cpu特定的指令,但它是相同的东西),这是编译器的主要工作之一,允许你调用内存区域'count_of_mice'或'size_of_planet', cos它真正难以阅读的代码只有数字

答案 2 :(得分:0)

变量的地址是其识别特征之一。您不能更改变量的地址,只能更改值1。

或者这是另一个类比:假设我在一张纸上写下我的街道地址,“99 JB Lane”,然后把它给你。您可以使用该纸帮助您访问我的房子。你甚至可以选择改变我的房子,比如耙树叶。现在假设你在纸上涂抹“99”并用“42”替换它。你不是那样改变了我的实际门牌号,你也不能以这种方式让我的房子和我的邻居家成为同一栋房子。但是,如果“42 JB Lane”恰​​好是一个有效的地址,那么您可以使用该文件访问那里的房子。

函数address()收到的参数值就像我给你的纸条:它们告诉函数在哪里找到两个变量的值,甚至启用它来修改那些值,但函数不能使用它们来更改其值存储在这些地址的变量的标识