是否可以交换两个变量的地址?

时间:2014-12-13 12:33:43

标签: c pointers swap

我知道可以交换两个变量的值,如此

#include <stdio.h>

void swap(int *x, int *y);
int main(){
    int x=5,y=10;
    swap(&x, &y);
    printf("x: %d, y: %d\n", x, y);
    return 0;
}

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

但是可以交换这两个变量的地址吗?而且我并不意味着只是指向它们然后交换指针所持有的值,我的意思是实际交换两者,这样在交换函数之后x的地址现在是交换之前的地址y功能,反之亦然。

如果这是一个愚蠢的问题,我很抱歉,但我很想知道这样的事情是否可行。如果这种行为不可能,为什么?

3 个答案:

答案 0 :(得分:8)

不,那是不可能的。您无法选择变量的地址,也无法修改它们。

答案 1 :(得分:3)

在运行时,您不再拥有xy。你有两个内存地址,每个地址保留sizeof int个字节,假设它们都存储一个整数。

你可以交换这些内​​存区域的内容,你可以使用它们的地址指针变量,并且可以像你说的那样交换它们。在这里交换任何东西都没有任何其他有意义的方法,所以答案是“不”,因为这种交换的概念不存在。

我想,如果您有虚拟内存页面而不是整数,那么您可以交换它们,但就目前的应用程序代码而言,即使这样也只是交换内存内容的有效方式。

如果您走出高级语言,那么您可以使用自修改代码,您可以在其中更改程序的汇编代码以访问y而不是x,反之亦然。但从概念上讲,这与将许多指针嵌入到程序集中并更改指针相同。此外,非常理论化的方式,需要可写代码段,因此在现代操作系统without extra tricks中甚至不可能。

答案 2 :(得分:0)

不传递指针指针,这是不可能的。 C中的所有函数调用都是按值调用的。参数是指针类型的函数调用通常称为&#34;通过引用调用&#34; (顺便说一下,为方便起见,它与C ++的引用调用概念不同),但它实际上也是按值调用。见下面的例子。

void foo(int a, int b) {
    a = 0;
    b = 0;
}

void bar(int* ap, int* bp) {
    ap = NULL;
    bp = NULL;
}

void qux(int* ap, int* bp) {
    *ap = 0;
    *bp = 0;

    ap = NULL;
    bp = NULL;
}

int main() {
    int x = 2;
    int y = 3;
    int* xp = &x;
    int* yp = &y;

    foo(x, y); 
        // x and y don't change here
    bar(xp, yp);  
        // xp and yp don't change here
    qux(xp, yp);
        // xp and yp don't change here, but x and y do
}

很容易看出foo()是如何按值调用的。 xy的副本将传递给它(因此按值调用)。它所做的任何更改都是自己的副本(在其范围内命名为ab)。 xy不受影响,并且在此函数返回后main()内不会更改。

虽然对于初学者来说有点难以理解,bar()也是按值调用。 xpyp的副本将传递给它。它所做的任何更改都是自己的副本(在其范围内命名为apbp)。 xpyp不受影响,并且在此函数返回后不会在main()中更改。

(注意上段中的最后3行与前一行几乎相同。唯一的区别是xy的类型是int,而xpypint*。)

qux()也是按值调用的,因为它会收到xpyp的副本(在其范围内称为apbp)。但是,它可以取消引用 apbp,它们是xpyp的副本,指向相同的内存位置。 main()范围内的名称为xy的内存位置。如果qux()更改了这些值 内存位置,它更改main()&#39; s&#34; view&#34; xy

因此,通过被调用函数更改这些指针值的唯一方法是将这些指针的地址发送到函数,然后可以取消引用并可能更改。但是,您的问题已经排除了该选项,所以不,这是不可能的。