Code Bye

用指针进行 地址交换问题

代码如下:
void ExchangeLocation(int first,int second){
    int *ptr_f = &first , *ptr_s = &second;
    int *ptr_f_location = ptr_f,*ptr_s_location = ptr_s;
    unsigned int *temp = 0;
    *temp = *ptr_s_location;
    *ptr_s_location = *ptr_f_location;
    *ptr_f_location = *temp;
}

可以通过编译,但是输入参数就会报错
为什呢么?
运行到第五行就会出问题,该怎么改才能输出正确的结果?

解决方案

10

你有一些概念没有搞清楚。
1、变量的地址是无法改变的。
例如,定义一个变量   int   a;  那么a的内存地址就是固定的,你没有办法改变a的地址。
假如要获取a的地址,可以是 &a
2、指针是一种特殊的变量,指针可以存放变量的地址。
例如,定义一个指针 int * p;   让p存放a的地址。 p = &a;
指针的值可以改变,例如有int b;   那么 可以 p = &b;
这个时候, p的值改变了,不再是a的地址,而是b的地址。
注意,p的值虽然改变了,但是a的地址没有改变,依然是 &a。
只不过是p与&a已经没有关系了。

20

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

temp指向的是0这块内存,这块内存是不可读写的,所以下面的*temp将导致出错

那 初始化成什么呢?

你得让指针指向一块有效的内存,如指向栈上的变量,或动态分配的空间

这个问题解决了 那为何 本人的代码始终无法实现交换两个参数地址 …..  所谓的二级指针到底怎么用….

你参数是按值传递的,也就是函数中的参数只是一个复制品,你交换

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

temp指向的是0这块内存,这块内存是不可读写的,所以下面的*temp将导致出错

那 初始化成什么呢?

你得让指针指向一块有效的内存,如指向栈上的变量,或动态分配的空间

这个问题解决了 那为何 本人的代码始终无法实现交换两个参数地址 …..  所谓的二级指针到底怎么用….

你参数是按值传递的,也就是函数中的参数只是一个复制品,你交换

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

temp指向的是0这块内存,这块内存是不可读写的,所以下面的*temp将导致出错

那 初始化成什么呢?

你得让指针指向一块有效的内存,如指向栈上的变量,或动态分配的空间

这个问题解决了 那为何 本人的代码始终无法实现交换两个参数地址 …..  所谓的二级指针到底怎么用….

你参数是按值传递的,也就是函数中的参数只是一个复制品,你交换的也只是复制品,并不会影响到外面

本人发现这个问题了 所以现在混了 、、、  不知道怎么写才能实现地址传递。

函数参数要传入变量的地址,而不是变量的值,也就是用指针方式传递

int *p_a = &a,*p_b = &b;
        int **p1 = &p_a,**p2 = &p_b;
        cout << &a << " " << &b <<endl;
        cout << &p_a << " " << &p_b<<endl;
        cout << *p1 << " " << *p2 <<endl;
        *p1 = *p2;
        //ExchangeLocation(&p_a,&p_b);
        cout << &a << " " << &b <<endl;
        cout << &p_a << " " << &p_b<<endl;
        cout << *p1 << " " << *p2 <<endl;

为何这样  还是无法改变a的地址…. 明明p1 获取到了a的地址 但是只改变了p1的地址
指针的操作不是直接 通过地址操作么?

改变指针的值 并不是改变 指针所指变量的地址,而是让指针指向新的地址


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明用指针进行 地址交换问题