user-0 提问: 在线等一道C语言问题在线等求助，指针地址如何交换

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 你的定义方式是 int a=99; a 其实本质上可以认为是一块地址，地址的内容是99，你只能改变内容，无法改变自己的地址。打个比方就是你没办法举起你自己。 你应该将a定义成指针 int data=99; int* a=&data;

user: user-3
content: 你想在函数中改变某个变量，就需要传入他的地址。 因为你想要改变指针，所以就要传入指针的地址。也就是 *aa的地址**aa

user: user-4
content: 根源上，楼主还是没有理解， 传参数传递进入函数的到底是什么  int swap(int *a, int *b);  这是函数的定义，它只说明了， 要传递的两个参数的类型都是int *  主函数main当中，对函数的调用语句： swap(&a,  &b); 这里的两个参数部分， 是表达式，  只要这个表达式，返回的类型是函数定义时刻所有要求的类型就符合语法规范 所以， 可以swap（&a +1， &b-1 ） 这种调用都是合法的  这里，看不到的是，编译器在把代码转换成机器码去实际执行时刻的部分 实际上， 编译器会在对这个函数做具体调用之前，完成几个工作 1 完成表达式的计算， 得到真正的返回值；        楼主代码当中，&a和&b返回的是a和b变量的地址 2 把返回值放到系统栈当中，做为被调用函数的局部变量供函数来使用 3 条转到函数的执行入口  进入函数的入口后， 开始执行函数体内的代码部分 这个时候， 函数定义部分的参数， 和系统栈当中的放入的表达式返回值对应起来 楼主的代码当中a和b，在这个时候才和主函数当中a和b变量的地址对应上了 函数定义的参数名字，叫做ab也好，叫做cd也罢，都是一个符号， 他们只是和栈里面的表达式返回值对应上 和原始的调用参数时刻的表达式里面的变量名字之间没有任何关系 也就是说，函数里面的a和b， 与主函数的a和b是风牛马不相及的  swap函数当中的a和b，是int *类型； 主函数当中的a和b是int类型； 他们只是名字相同，但是完全不是一个东西 我们完全可以把swap函数定义的参数改名为c和d， 对整个函数的执行没有任何影响 swap函数里面的a变量，保存的是主函数当中a变量的地址， 他们的关系仅此而已 既然是地址，要赋值就是要 *a = 。。。。 这种操作了  函数内部所实现的改变， 只有两种方式能够带回到主函数 1 利用return命令， 把要返回到内容（语法上也是一个表达式， return命令会把表达式计算的结果计算出来），放到系统堆栈和系统寄存器里面。  外部调用函数 ret = swap（。。。。） 语句，通过 = 这个赋值语句从寄存器或者堆栈当中获得返回值  2 函数体内部改变了全局变量，或者是通过传递到指针，改变了指针所指向的内容的方式，间接的把计算结果带回了主函数  无论哪种方式， 都没有涉及到对传递进来的参数值的使用， 所以对参数自身的改变是带不出函数体的 传递进来的参数值，在函数return的那一刻，堆栈弹出，所对应的内存失效了， 函数体内对他的改变因此而全部消失了   仔细看看书， 关于函数参数，任何一本书都会有特别的说明的， 尤其是这个swap例子，几乎是每本c的书，都拿它来做为例子讲参数的问题

user: user-5
content: 引用 1 楼 henhaowoxini 的回复:  其中在调用swap函数时  swap(&a, &b);  将在main 中将局部变量 a,b 的内存地址值赋给寄存器 或 main栈内存中，然后跳转执行 swap 函数  在swap函数中  void swap(int *aa, int *bb) {     int *temp = aa;     aa = bb;     bb = aa; }  将从传参寄存器或父（main）栈中取实参&a, &b于局部变量(形参)aa, bb中。swap后续语句都是在操作swap中的局部变量，所以不会影响父栈中的变量的值。  若要交互父栈中两个变量的值，可以实现如下:  #include <stdio.h> #include <stdint.h>  static void _swap(int **aa, int **bb) {     uintptr_t t = (uintptr_t)*aa;      *aa = *bb;     *bb = (void *)t;      return ; }  int main(void) {     int a, b;     int *aa = &a;     int *bb = &b;      fprintf(stderr, "before _swap aa=%p, bb=%p\n", aa, bb);      _swap(&aa, &bb);      fprintf(stderr, " after _swap aa=%p, bb=%p\n", aa, bb);      return 0; }

user: user-6
content: 现在能看懂了吗，你只是改变了a b 对应的值， a b 的地址是不变的

user: user-7
content: 引用 7 楼 henhaowoxini 的回复:[quote=引用 2 楼 與蘤舊縐 的回复:] 函数传入的是a和b的地址 aa指向a，bb指向b  temp指向了a aa指向了b bb指向了temp所指的位置即原a  你只是把指针aa和bb的指向互换了而已，而这两个指针在函数结束后不再有用，要换内容必须用*取值交换 四楼那个图为什么就实现互换了[/quote]  我不是说了吗，用*取值交换，这不就是取值交换了吗 temp接收了指针a指向的值即a b指向的值赋值给a指向的值 temp的值，即原来的a，赋值给b指向的值 这不就交换了原来的ab吗

user: user-0
content: 引用 2 楼 與蘤舊縐 的回复:函数传入的是a和b的地址 aa指向a，bb指向b  temp指向了a aa指向了b bb指向了temp所指的位置即原a  你只是把指针aa和bb的指向互换了而已，而这两个指针在函数结束后不再有用，要换内容必须用*取值交换 四楼那个图为什么就实现互换了

user: user-6
content: 老哥你交换的值，又不是对应的地址

user: user-0
content: 引用 3 楼 比卡丘不皮 的回复:你没有理解指针的含义，还有有关左值右值的感念。首先当你 a b 定义下来的时候，他们的地址是不变的，当你&a  &b  分别去地址的是时候是临时变量指针，aa->a  bb ->b  当你只是让 aa  bb 互相换了值 aa->b   bb-> a,  aa  bb是两个临时变量  当你&a &b 的时候，与 aa bb 没有任何的关联。  麻烦看下楼上哪个，为什么就互换了

user: user-0

user: user-6
content: 你没有理解指针的含义，还有有关左值右值的感念。首先当你 a b 定义下来的时候，他们的地址是不变的，当你&a  &b  分别去地址的是时候是临时变量指针，aa->a  bb ->b  当你只是让 aa  bb 互相换了值 aa->b   bb-> a,  aa  bb是两个临时变量  当你&a &b 的时候，与 aa bb 没有任何的关联。

user: user-7
content: 函数传入的是a和b的地址 aa指向a，bb指向b  temp指向了a aa指向了b bb指向了temp所指的位置即原a  你只是把指针aa和bb的指向互换了而已，而这两个指针在函数结束后不再有用，要换内容必须用*取值交换

user: user-0