为什么要用指向结构体的二重指针

zihui0459 2017-08-21 10:52:56
struct student *p1,*p2;假设有这样两个指向结构体的结构变量。
swap(struct student *p1,struct student *p2)//这个函数用来完成两个指针的互换。
{
p1=p2;
}
在主函数中
swap(p1,p2);
printf("%d",(*p1).score);
经测试是可以完成p1与p2的互换的,为什么还要用二重指针指向结构体呢?
swap(struct student**p1,struct student**p2);
swap(&p1,&p2);
...全文
808 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2017-08-22
  • 打赏
  • 举报
回复
//仅交换两个结构体的内容 (两个指针本身未变化, 只内容变化了) void swap(STU *p1,STU *p2) { STU temp = *p1; *p1 = *p2; *p2 = temp; } //交换指针本身(因为指针本身变化了,其指向的内容肯定也跟着变化了) void swap2(STU **p1,STU **p2) { STU *temp = *p1; *p1 = *p2; *p2 = temp; }
zihui0459 2017-08-22
  • 打赏
  • 举报
回复
引用 11 楼 xiaohuh421 的回复:
如果你仅是想交换两个结构体的内容, 而不是指针本身, 那么不需要二重指针. 你果你要交换两个指针本身的值, 那么肯定就需要用二重指针了.
能写一下具体的函数吗?交换两个结构体的内容和交换指针本身有什么不同吗
xiaohuh421 2017-08-22
  • 打赏
  • 举报
回复
如果你仅是想交换两个结构体的内容, 而不是指针本身, 那么不需要二重指针. 你果你要交换两个指针本身的值, 那么肯定就需要用二重指针了.
赵4老师 2017-08-21
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
jena_wy 2017-08-21
  • 打赏
  • 举报
回复
swap有问题,二重指针是指针的指针。
自信男孩 2017-08-21
  • 打赏
  • 举报
回复
首先,你的swap函数里交换连个指针内容有问题,p1 = p2;这样时p1指向了p2指向的内存区域,但是p2并没有指向p1指向的内存区域; 其次,使用二重指针,这样能保证参数p1, p2是传出参数,即是通过swap交换之后能够得到新的内存区域(交换之后的)
自信男孩 2017-08-21
  • 打赏
  • 举报
回复
引用 9 楼 zihui0459 的回复:
[quote=引用 1 楼 cfjtaishan 的回复:] 首先,你的swap函数里交换连个指针内容有问题,p1 = p2;这样时p1指向了p2指向的内存区域,但是p2并没有指向p1指向的内存区域; 其次,使用二重指针,这样能保证参数p1, p2是传出参数,即是通过swap交换之后能够得到新的内存区域(交换之后的)
是因为值传递的原因吗?二重指针可以改变链表实参指针的指向吗?[/quote] 对,建议在草稿纸画画指针指向
zihui0459 2017-08-21
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
首先,你的swap函数里交换连个指针内容有问题,p1 = p2;这样时p1指向了p2指向的内存区域,但是p2并没有指向p1指向的内存区域; 其次,使用二重指针,这样能保证参数p1, p2是传出参数,即是通过swap交换之后能够得到新的内存区域(交换之后的)
是因为值传递的原因吗?二重指针可以改变链表实参指针的指向吗?
zihui0459 2017-08-21
  • 打赏
  • 举报
回复
引用 4 楼 sinat_39459036 的回复:
void swap(STU *p1,STU *p2) { STU tmp; //tmp = malloc(4); tmp = *p1; *p1 = *p2; *p2 = tmp; //free(tmp); return ; } void swap2(STU **p1,STU **p2) { STU **tmp; tmp = malloc(4); *tmp = *p1; *p1 = *p2; *p2 = *tmp; free(tmp); return ; }
试了一下好像换不了啊? int main() { struct student *p1,*p2; p1=p2=(struct student*)malloc(sizeof(struct student)); scanf("%d %d",&(*p1).num,&(*p1).score); scanf("%d %d",&(*p2).num,&(*p2).score); swap(p1,p2); printf("第一位学生成绩%d %d",(*p1).num,(*p1).score); printf("第二位学生成绩%d %d",(*p2).num,(*p2).score); }不知道是不是我这主函数参数传的不对呢?
zihui0459 2017-08-21
  • 打赏
  • 举报
回复
引用 5 楼 xiaohuh421 的回复:
swap(struct student *p1,struct student *p2)//这个函数用来完成两个指针的互换。 { p1=p2; } 你确定这个能交换.... 指针本身是值传递的, 除非你在内部交换它们的值 *p1 = *p2这种类似的取地址操作, 才是地址传递, 可修改值. 如果你这样写能交换, 只能说明你用的编译器有问题, 不符合标准.
不小心写错了。。。我想问下这个必须要在swap函数的形参用二重指针才能完成互换吗?原理和swap(int a,int b)这个换不了是一个道理吗?
kugeniha 2017-08-21
  • 打赏
  • 举报
回复
不用二级指针不能互换吧
xiaohuh421 2017-08-21
  • 打赏
  • 举报
回复
swap(struct student *p1,struct student *p2)//这个函数用来完成两个指针的互换。 { p1=p2; } 你确定这个能交换.... 指针本身是值传递的, 除非你在内部交换它们的值 *p1 = *p2这种类似的取地址操作, 才是地址传递, 可修改值. 如果你这样写能交换, 只能说明你用的编译器有问题, 不符合标准.
Frank1684 2017-08-21
  • 打赏
  • 举报
回复
void swap(STU *p1,STU *p2) { STU tmp; //tmp = malloc(4); tmp = *p1; *p1 = *p2; *p2 = tmp; //free(tmp); return ; } void swap2(STU **p1,STU **p2) { STU **tmp; tmp = malloc(4); *tmp = *p1; *p1 = *p2; *p2 = *tmp; free(tmp); return ; }

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧