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

C 如何使用函数更改变量的地址?,c,memory-address,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; } 我猜你想要 void address (int* x, int* y) { *x = *

我试图用一个函数来改变某个变量的地址,但我不知道怎么做。。。然而,我的目标是:

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;
}
我猜你想要

void address (int* x, int* y)
{
    *x = *y;
}
尽管你问题的措辞很糟糕

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

更多答案

main中的x和y是位于0x1234和0x1236的int,然后调用函数。它碰巧有两个参数,称为x和y,它们实际上与main中的x和y没有关联。这些参数是指向整数的指针,其中包含2个整数的地址。在你的情况下,干线的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;
等等(你确实说了‘thing at’,你有一些特定于cpu的指令,但这是同一件事),这是编译器的主要任务之一,允许你调用内存区域‘count_of_mice’或‘size_of_planet’,因为它真的很难读取只有数字的代码,我怀疑你想要

void address (int* x, int* y)
{
    *x = *y;
}
尽管你问题的措辞很糟糕

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

更多答案

main中的x和y是位于0x1234和0x1236的int,然后调用函数。它碰巧有两个参数,称为x和y,它们实际上与main中的x和y没有关联。这些参数是指向整数的指针,其中包含2个整数的地址。在你的情况下,干线的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;
等等(你确实说了“thing at”,你有一些特定于cpu的指令,但这是同一件事),这是编译器的主要任务之一,允许你调用一个内存区域“count_of_mice”或“size_of_planet”,因为它真正难以读取的代码只有数字

我试图使用函数更改某个变量的地址

答案是:你不能。正如注释中指出的,
地址是物理属性的抽象。变量在内存中保留空间,并且只有一个变量可以占用给定的空间(在今天存在的体系结构上)

如果您的意思是要将两个包含地址(也称为
指针
)的变量的值更改为包含不同的值,则需要将变量声明为指针,并且函数需要接受指向指针的指针。例如:

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;
}
我试图使用函数更改某个变量的地址

答案是:你不能。正如注释中指出的,
地址是物理属性的抽象。变量在内存中保留空间,并且只有一个变量可以占用给定的空间(在今天存在的体系结构上)

如果您的意思是要将两个包含地址(也称为
指针
)的变量的值更改为包含不同的值,则需要将变量声明为指针,并且函数需要接受指向指针的指针。例如:

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的值一样

或者这里有另一个类比:假设我把我的街道地址写在一张纸条上,“99 JB巷”,然后给你。你可以用那张纸帮你参观我家。你甚至可以选择改变我的房子,比如说耙树叶。现在假设你把纸上的“99”涂掉,换成“42”。你不能那样改变我的实际房子号码,也不能那样使我的房子和我邻居的房子成为同一所房子。但是,如果“42 JB Lane”恰好是一个有效地址,那么你可以使用该文件访问那里的房子

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