代码如下:
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已经没有关系了。
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
你参数是按值传递的,也就是函数中的参数只是一个复制品,你交换
temp指向的是0这块内存,这块内存是不可读写的,所以下面的*temp将导致出错
那 初始化成什么呢?
你得让指针指向一块有效的内存,如指向栈上的变量,或动态分配的空间
这个问题解决了 那为何 本人的代码始终无法实现交换两个参数地址 ….. 所谓的二级指针到底怎么用….
你参数是按值传递的,也就是函数中的参数只是一个复制品,你交换
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的地址
指针的操作不是直接 通过地址操作么?
改变指针的值 并不是改变 指针所指变量的地址,而是让指针指向新的地址