用指针交换ab,看看哪出问题了

img


帮忙看看哪里错了吧,为啥最后只有a得到了b的值,而b的值没有变呢

第9行和第11行式子两边位置放反了,把两处式子左右交换下即可。

修改如下:


#include <stdio.h>

int main(void){
    
    int a,b,t,*p,*q;
    a=10;
    b=2;
    p=&a;
    q=&b;
    
    t=*p;  // 改变p指向位置的值前, 把p指向位置的值保存到变量t中 
    *p=*q;  // 把p指向位置的值改变为q指针指向位置的值 
    *q=t;  //  把q位置的值 改变为 t的值,通过以上三步,达到交换两个指针位置值的目的 
    
    printf("a=%d,b=%d",a,b);
    
    return 0;
} 

img

t是用于中间过渡的变量,所以在交换之间应该先给t进行赋值,存放起来,不然后面找不到

t=*p;  // 因为下一步是要把p指针指向的位置的值给修改掉,那么就要提前先把p位置原本的值找个地方存放起来,不然就直接被覆盖,再也找不到
*p=*q;  // 这里把p位置的值换成了q位置的值,这个时候,p/q两个位置的值都是q位置原本的值, 完成了对p位置的修改
*q=t; // 这里把事先保存在t的值赋值给q位置,完成对q位置的修改

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7748127
  • 这篇博客你也可以参考下:指针 ,将字符串a复制给字符串b
  • 除此之外, 这篇博客: 2019NHOI小甲解题思路中的 解题思路:这题的考点是标技数组,题目要求出的是A集合的数字中,减去B集合中存在的A集合的数字;即求AB两个集合的差集,数据范围不大,直接使用两个标记数组进行比较即可。附代码如下: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <bits/stdc++.h>
    using namespace std;
    int Na,Nb,Useda[10005],Usedb[10005],ans;
    int main(){
    	cin>>Na>>Nb;
    	ans=Na;
    	int x;
    	for(int i=0;i<Na;i++)
    	{
    		cin>>x;
    		Useda[x]=1;//标记A集合
    	}
    	for(int i=0;i<Nb;i++)
    	{
    		cin>>x;
    		Usedb[x]=1;//标记B集合
    	}
    	for(int i=0;i<=10000;i++) 
    		if(Useda[i]==1&&Usedb[i]==1)//计算AB的差集
    			ans--;
    	cout<<ans;
    	return 0;
    }