把a的地址放到b,把b的地址放到c,现在给个c,那么怎么拿到a的值

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-08-24
C语言,请问把a,b的地址赋给两个指针变量后,指针变量交换会交换a,b地址里的值吗?

int t,*pa,*pb
*pa=a;*pb=b;
t=*pa;
*pa=*pb;
*pb=t;
这样才能实现指针的指向对象的交换,只是赋值的话不会改变内存中的值。

你可打开邮件的详细内容,可见邮件的历史记录,会有其历史发件人的邮箱地址。

printf("a = %d, b = %d\n", a,b);
a,b 是变量……指针p1和p2保存的是a和b的地址

函数的参数说起来复杂其实就2种传递,值传递和引用传递,有的人说什么地址传递或指针传递,这其实也是值传递。值传递和引用传递针对的是变量本身,而非通过变量的值找到内存地址做什么改动。
所以说你的函数 void swap(int *pa, int *pb) 指针 p1,p2代入后会生成2份拷贝 pa,pb
pa保存的值是p1的值,也就是a的地址,pb保存的值是p2的值,也就是b的地址。
所以接下来针对pa和pb进行的值交换操作,其结果只是让pa保存了b的地址,pb保存了a的地址,pa和pb在函数结束调用后,生命周期完结。这函数不会对指针p1和p2有任何的影响。

如果你想交换p1和p2指针的值,那就要把函数写成 void swap(int* &pa, int* &pb)
它表示对一个int型指针的引用,这样你的交换会确实的影响到p1和p2的值,让p1保存了b的地址,p2保存了a的地址。就等于执行了 p1=&b; p2=&a;

但最后的问题是,你选择了打印输出变量 a 和 b。因为从头至尾都没对指针p1、p2指向的内存地址上保存的值做任何改动和操作,所以a和b的值没变。 想看到变化就要把这句改为
printf("a = %d, b = %d\n", *p1, *p2);
是不是很麻烦?所以你完全可以像2楼说的那样直接把函数内容修改一下通过传递进去的地址值直接将该地址上保存的数字进行交换。

  • 定义整形变量a和b输入a和b的值使用指针papb分别指向a和b的c 程序
    答:int a=0 ,b=0;//变量定义并初始化 int*pa=NULL,*pb=NULL;//指针变量定义并初始化 pa=&a;//使用&取地址运算符将变量a的地址赋予指针pa,使得指针pa指向a pb=&b;//使用&取地址运算符将变量b的地址赋予指针pb,使得指针pb指向b
  • C语言代码出错,求改!内容是吧数组a,b的元素存入数组c中,元素再从小到大...
    答:4]&&q<=&b[2]){ if(*p<=*q) *r++=*p++;else *r++=*q++;} while(p<=&a[4]) *r++=*p++;while(q<=&b[2]) *r++=*q++;mySort(c);/*排序*/ for(i=0;i<8;i++)printf("a[%d]=%d\n",i,c[i]);/*这里是合并到c数组中*/ printf("\n");return 0;} ...
  • 如excel表格a列客户地址,b列城市,c列城市代码,如何通过城市匹配客户地 ...
    答:G2=INDEX(C:C,MATCH($E2,$B:$B,))上图,直观点
  • 简单的C语言问题
    答:你在内存共有四个区域,a,b,p1,p2,其中a=1,b=6,现在你把a的地址放到p1中,b的地址放到p2中,然后p1和p2交换了一下存储内容,就没有然后了,这样a,b的值根本就不可能改变,必须让p1=&a,p2=&b,然后传递参数时写swap(p1,p2),这样才能让p1,p2互换了内容后,又指回来。
  • int* a= b;
    答:int *a=b是说把b的值赋值给指针a(*a), int*a=&b是说让指针a(*a)指向b的地址。 举个例子说: int b=5,c=9 int *a1=b;---1 int *a2=&b;___2 b=c;---3 这个时候*a1=5,*a2=9 。因为在说第一步时已经把b的值,也就是5传给*a1,所以*a1=5 。在第二步时,把...
  • C语言中用指针怎么存放另一个指针的地址,比如,地址(2000)中存放一个数...
    答:比如说a这个变量吧,他存了一个数字,在地址2000中 那么局势int p=&a &a就是取a的地址,即&a就是2000了。那么*p就是指指向p这个地址的内存空间,也就是a了
  • C语言编写程序,读三个整数a,b,c,把a的值给b,b给c,c给a,再输出abc
    答:include<stdio.h> main(){ int a,b,c,t;scanf("%d %d %d",&a,&b,&c);t=a;a=b;b=c;c=t;printf("%d %d %d",a,b,c);} 应该没问题,你看一下吧!
  • ...给a,b,c然后交换它们中的数,把a中原来的值给b,把b原来的值给c,把c...
    答:include<stdio.h> void main() { int a,b,c,d;scanf("%d%d%d",&a,&b,&c);d=c; c=b; b=a; a=d;printf("%d %d %d\n",a,b,c);}
  • c++中的指针变量一般用*a *b形式标示。但有时会用a无星号形式,请问有何...
    答:其实C代码编译成二进制后是不分类型的。指针的值就是虚拟存储的一个地址,地址也是值,也可以放在内存里。a=b就是说指针a所指向的地址里的内容换成b;a=*b就是说将指针b指向的地址里的内容放到指针a所指向的地址里;至于**a=*b,就是说,a指向的地址里存放的也是个地址,如果设这个地址为c,...
  • int* a= b;
    答:int *a=b是说把b的值赋值给指针a(*a), int*a=&b是说让指针a(*a)指向b的地址。 举个例子说: int b=5,c=9 int *a1=b;---1 int *a2=&b;___2 b=c;---3 这个时候*a1=5,*a2=9 。因为在说第一步时已经把b的值,也就是5传给*a1,所以*a1=5 。在第二步时,把...