值传递和地址传递的一个问题

NeilHappy 2012-01-08 01:31:18

//结构体定义
struct list
{
int data;
struct list *next;
};
typedef struct list NODE;
typedef NODE *LINK;

LINK reverse(LINK head);
int main()
{
LINK ptr,head;
reverse(head);//如果不接收reverse函数返回的值,head就不会改变,但是head不是一个指针吗?如果改成 //head=reverse(head)就是正确的了,但我不明白这是为什么?
}

//不借助辅助空间,直接逆序单链表
//练手小程序,没有考虑其健壮性和容错性,请保证结点个数大于3
LINK reverse(LINK head)
{
LINK p1=head;
LINK p2=p1->next;
LINK p3=p2->next;
p1->next=NULL;
p2->next=p1;
while(p3!=NULL)
{
p1=p2;
p2=p3;
p3=p3->next;
p2->next=p1;
}
return p2;
}


main中如果不接收reverse函数返回的值,head就不会改变,但是head不是一个指针吗?如果改成 head=reverse(head)就是正确的了,但我不明白这是为什么?以前我一直以为弄懂了值传递和地址传递,但我不能理解这是为什么,请大家帮帮忙,说一下原因,非常感谢!
...全文
186 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
面包大师 2012-01-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 czh3642210 的回复:]
你只是定义了一个LINK类型,别没有给他分配内存,在调用head的时候要首先分配内存给他,如下:

C/C++ code

LINK ptr,head;
head = (LINK)malloc(sizeof(LINK));
memset(head, 0, sizeof(LINK));
reverse(head);
[/Quote]

这儿我说少了些东西。。。你只要在reverse函数中赋值了,就会改变head的值
面包大师 2012-01-08
  • 打赏
  • 举报
回复

LINK ptr,head;
head = (LINK)malloc(sizeof(LINK));
memset(head, 0, sizeof(LINK));
reverse(head);
printf("%d", head->data);//这儿打印出来的就是11
}
LINK reverse(LINK head)
{
head->data = 11;
return NULL;
}

NeilHappy 2012-01-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kimshuen 的回复:]

我觉得这样理解还是有点不对。应该是你的函数并没有改变head的值,而是改变了head指向的内容。
[/Quote]
我就是这个意思,改变了head指向的内容,但我觉得head的值就是其指向的内容啊。
Kimshuen 2012-01-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 neilhappy 的回复:]
引用 5 楼 year2002 的回复:

把LINK reverse(LINK head)函数里面的那个LINK head改成别的名字你就明白了
这个head只不过是外面那个head的副本,对这个head赋值是不会改变外面的那个的

非常感谢,你的话让我茅塞顿开。我发现我一直都有一个误区,我一直以为只有传递一个简单变量(比如 int a)才是值传递,而传递指针是传递地址,会对原值产生影……
[/Quote]
我觉得这样理解还是有点不对。应该是你的函数并没有改变head的值,而是改变了head指向的内容。
NeilHappy 2012-01-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 year2002 的回复:]

把LINK reverse(LINK head)函数里面的那个LINK head改成别的名字你就明白了
这个head只不过是外面那个head的副本,对这个head赋值是不会改变外面的那个的
[/Quote]
非常感谢,你的话让我茅塞顿开。我发现我一直都有一个误区,我一直以为只有传递一个简单变量(比如 int a)才是值传递,而传递指针是传递地址,会对原值产生影响。但是我觉得我终于理解了,传递一个指针过来,而指针也是个变量,所以也是传递的指针的拷贝,但这个指针中的内容是地址,所以通过指针可以改变其指向的值。而在这段代码中,把head的拷贝传递过来后,是直接改变了这个变量的值,没有间接访问原值。
请问下我的理解对吗?
  • 打赏
  • 举报
回复
把LINK reverse(LINK head)函数里面的那个LINK head改成别的名字你就明白了
这个head只不过是外面那个head的副本,对这个head赋值是不会改变外面的那个的
NeilHappy 2012-01-08
  • 打赏
  • 举报
回复
不好意思,补充说明一下:

int main()
{
LINK ptr,head;//这里的指针都是经过初始化了的,步骤省略了
reverse(head);//如果不接收reverse函数返回的值,head就不会改变,但是head不是一个指针吗?如果改成//head=reverse(head)就是正确的了,但我不明白这是为什么?
}
NeilHappy 2012-01-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 czh3642210 的回复:]

你只是定义了一个LINK类型,别没有给他分配内存,在调用head的时候要首先分配内存给他,如下:
C/C++ code

LINK ptr,head;
head = (LINK)malloc(sizeof(LINK));
memset(head, 0, sizeof(LINK));
reverse(head);
[/Quote]
这段代码不是完整的,完整的代码head等指针都是经过了初始化的。应该不是指针初始化的问题吧。
面包大师 2012-01-08
  • 打赏
  • 举报
回复
这样调用的时候就不会有问题了
面包大师 2012-01-08
  • 打赏
  • 举报
回复
你只是定义了一个LINK类型,别没有给他分配内存,在调用head的时候要首先分配内存给他,如下:

LINK ptr,head;
head = (LINK)malloc(sizeof(LINK));
memset(head, 0, sizeof(LINK));
reverse(head);

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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