static void swapAddr(int *numOne, int *numTwo)
{
int *tmp;
tmp = numOne;
numOne = numTwo;
numTwo = tmp;
}
int main(void)
{
int a = 15;
int b = 10;
printf("a is: %d\n", a);
printf("Address of a: %p\n", &a);
printf("b is: %d\n", b);
printf("Address of b: %p\n", &b);
swapAddr(&a, &b);
printf("\n");
printf("a is: %d\n", a);
printf("Address of a: %p\n", &a);
printf("b is: %d\n", b);
printf("Address of b: %p\n", &b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译并运行这段代码时,输出是
a is: 15
Address of a: 0x7fff57f39b98
b is: 10
Address of b: 0x7fff57f39b94
a is: 15
Address of a: 0x7fff57f39b98
b is: 10
Address of b: 0x7fff57f39b94
Run Code Online (Sandbox Code Playgroud)
显然,结果不是我想要的,因为地址似乎根本没有交换过.
您通常无法更改变量的地址.
你的'swapAddr'函数改变了它的参数值,但它们是函数的本地值 - 你不会改变函数之外的任何东西.理解它的最好方法可能是函数参数总是接收传递给函数的值的副本.在这种情况下,你会得到一个复制的地址a和复制的地址b.您可以并且确实更改包含这些副本的变量的值(numOne和numTwo),并查看它们是指针,您可以(但不是)更改它们指向的值(变量的值a和b) - 但您可以' t更改原始变量的地址.
要打破它:
static void swapAddr(int *numOne, int *numTwo)
{
int *tmp;
tmp = numOne;
Run Code Online (Sandbox Code Playgroud)
在这一点上,tmp并且numOne都指向值a变量...
numOne = numTwo;
Run Code Online (Sandbox Code Playgroud)
现在,numOne指向b变量的值......
numTwo = tmp;
}
Run Code Online (Sandbox Code Playgroud)
最后,numTwo现在指向a变量的值.该函数返回和numOne和numTwo不再在该点之后存在.变量的地址a,并b在任何阶段并没有改变.
但是,您可以编写一个函数来交换两个指针变量中的地址:
static void swapAddr(int **ptrOne, int **ptrTwo)
{
int *tmp;
tmp = *ptrOne;
*ptrOne = *ptrTwo;
*ptrTwo = tmp;
}
Run Code Online (Sandbox Code Playgroud)
这将允许您传递两个指针变量的地址,并在返回时指针将被交换 - 每个指针指向另一个先前的指针.但同样,这不会改变那些指针碰巧指向的任何变量的地址.