永发信息网

C语言这样不能达到交换指针指向地址交换输出吗?为什么?求大神赐教

答案:2  悬赏:10  手机版
解决时间 2021-11-25 19:20
  • 提问者网友:火车头
  • 2021-11-25 13:49
C语言这样不能达到交换指针指向地址交换输出吗?为什么?求大神赐教
最佳答案
  • 五星知识达人网友:七十二街
  • 2021-11-25 15:14
函数调用的时候,形参是实参的副本。
所以你在这里交换的指针值只是实参的副本,原来的指针值并没有改变
看你函数的功能可以采用二级指针来完成

int main()
{
   ...
   swap(&p1,&p2);
   ...
}
void swap(char **p1,char **p2)
{
    char *tmp;
    tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}追问我只是想交换指针指向对象,就相当于换顺序输出

大概就是这个意思p1,p2指向对象改变后输出,能告诉我错哪了吗?求赐教

追答首先说一下什么是指针,指针是一种数据类型。指针有自己的所占的空间,这点跟地址的区别搞清楚。


现在的这段代码是没有问题的:
int *p1, *p2, *tmp;//这里的p1,p2,tmp在win32系统中都是有自己的所占的4字节内存的
int a = 1, b = 2;// a,b也各占有4字节(int长度)内存,分别存放 1,2
p1 = &a;//p1占用的内存存放a的地址,打比方是00420000
p2 = &b;//p2占用的内存存放b的地址,打比方是0041fffc
tmp = p1;// tmp 等于p1中数据,就是00420000
p1 = p2; //p1中存的就是0041fffc
p2 = tmp; //p2中存的就是00420000
printf("%d,%d",*p1,*p2);//现在再看p1,p2中的内容已经改变了,因为里面存的地址改变了

----------------------上次代码讲解--------------------------------------------
函数调用的时候,形参只是实参的副本(如果不理解形参,实参可以去看谭浩强的书)
int *p1, *p2, *tmp;
int a = 1, b = 2;
swap(p1,p2);//在这里p1和p2是实参,进入swap后里面操作的p1,p2只是这里p1,p2的副本
printf("%d,%d",*p1,*p2);//p1,p2里的数据没有变,变的只是p1和p2的副本

void swap(p1,p2)
{
    tmp = p1;//这里p1,p2都是形参,他们也有自己的四字节内存,跟main的p1,p2的内存不是一回事了
    p1 = p2; //这里操作的p1 p2都是新的内存,不会影响到main中的p1,p2
    p2 = tmp;//所以说你在main中printf的时候p1 p2并没有交换
}
全部回答
  • 1楼网友:大漠
  • 2021-11-25 16:34
要交换指针,要用指针的指针呀。
void swap(char **p1, char **p2)
{
char *temp;
temp = *p2;
*p2 = *p1;
*p1 = temp;
}
main里面调用swap的地方改成
swap(&p1, &p2);追问

我想问的是就像上面的简单交换一样,交换p1,p2指针指向的对象后输出,请问我原来的方程为什么不能实现,求赐教

追答看这几个对比一下就明白了
// 这是要交换int, 所以要传int*
void swap_int(int *p1, int *p2){ int temp;
temp = *p2; *p2 = *p1; *p1 = temp;}
// 这传的是char*, 所以可以交换char
void swap_char(char *p1, char *p2){ char temp;
temp = *p2; *p2 = *p1; *p1 = temp;}
//要交换字符串(一般认为字符串是char*),所以要传char **
void swap_str(char **p1, char **p2)
{ char* temp;
temp = *p2; *p2 = *p1; *p1 = temp;}追问谢谢你的答案 ,我对指针的理解更进一步了。。。多谢,多谢,大神
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯