如何解决C中的void指针交换函数
我写了一个func swap_pointers来替换两个指针所指向的内存地址。
表示在调用交换之前,v_a
指向int a
,v_b
指向b
,然后v_a
应该指向b
,和v_b
上的a
。
运行main()
时,我确实看到了地址切换,并且调用printf()
确实打印了6 8
,但是当行
a = *((int *) v_a);
b = *((int *) v_b);
被执行,变量(a
和b
)都收到值6
。
我不明白为什么会这样。
void swap_pointers(void **a,void **b){
void * tmp=*a;
*a = *b;
*b = tmp;
}
int main() {
int a = 8;
int b = 6;
void *v_a = &a;
void *v_b = &b;
swap_pointers(&v_a,&v_b);
printf("%d %d\n",*((int *) v_a),*((int *) v_b));
a = *((int *) v_a);
b = *((int *) v_b);
}
解决方法
进行交换后,resque
指向v_a
的地址,而b
指向v_b
的地址。
然后,当您这样做时:
a
您实际上是将a = *((int *) v_a);
的值分配给b
使其为6。
然后,当然,当您在下一行对a
进行赋值时,您就是在赋b
的新值6。
调用函数swap_pointers
swap_pointers(&v_a,&v_b);
指针v_a指向变量b和指针v_b指向变量a。
此声明之后
a = *((int *) v_a);
变量a
的值为6
。指针v_b
指向变量a
,该变量此时包含值6
。。因此在此语句之后
b = *((int *) v_b);
变量b
将获得存储在在先例赋值语句中获得的变量a
中与值6
相同的值。
要交换变量a
和b
中的值,您需要使用中间变量或编写另一个函数以交换类型int
中的对象中的值。
例如
void swap_integers( int *a,int *b )
{
int tmp = *a;
*a = *b;
*b = tmp;
}
函数可以像
那样调用swap_integers( v_a,v_b );
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。