读书人

关于指针作为函数参数的有关问题

发布时间: 2012-03-04 11:13:33 作者: rapoo

关于指针作为函数参数的问题
include <iostream>
using namespace std;

struct Student
{
long number;
float score;
Student *next;
};

Student* head;

Student* Create(void)
{
Student* PS;
Student* PEnd;

head = NULL;

while (1)
{
PS = new Student;
cin > > PS-> number > > PS-> score;
if (0 == PS-> number)
break;

if (NULL == head)
head = PS;
else
PEnd-> next = PS;

PEnd = PS;
}
PEnd-> next = NULL;
delete PS;

return head;
}

void Delete(Student* head, int number)
{
Student* p;

if (NULL == head)
{
cout < < "The list is empty! " < < endl;
return;
}

if (head-> number == number)
{
p = head;
head = head-> next;
delete p;
p = NULL;

cout < < "The head is deleted " < < endl;
return;
}

for (Student* pGuard=head; pGuard-> next; pGuard=pGuard-> next)
{
if (pGuard-> next-> number == number)
{
p = pGuard-> next;
pGuard-> next = p-> next;

delete p;
p = NULL;

cout < < "The number " < < number < < " is deleted! " < < endl;

return;
}
}

cout < < "Can not find " < < number < < "from list " < < endl;
return;
}

void ShowList(Student* head)
{
cout < < "The list is: " < < endl;

while (head)
{
cout < < head-> number < < " " < < head-> score < < endl;
head = head-> next;
}
}

void main(void)
{
Create();

ShowList(head);

Delete(head,3);
ShowList(head);

}
问题:
1.为什么void ShowList(Student* head)不会修改实参head而只修改形参head的地址?也就是说形参只是实参的一个拷贝?
2.为什么void Delete(Student* head, int number)里面修改了形参head所指向的地址实参head也跟着变化呢?
3.也就是说当指针做为函数的形参时,在什么情况下修改形参的地址或者所指向的地址实参也会变化?是不是修改*head的值,实参也会同步修改,但修改head的值,实参就不会同步变化?
谢谢!


[解决办法]
1.为什么void ShowList(Student* head)不会修改实参head而只修改形参head的地址?也就是说形参只是实参的一个拷贝?
===========
形参只是实参的一个拷贝,
所以修改 head 不能修改实参,
但是修改 *head 可以实现 修改 *实参, 因为拷贝的内容是完全一样的,
即 *head = *实参
------解决方案--------------------


好了,回答楼主的问题吧.

我觉得有的时候你可以这样看待形参与实参的关系,那就是相当于一个赋值过程:形参=实参.

好,那下面的问题:

void f(char *s)
{
}
这个函数,会不会修改实参? 其实要看实参是什么东西.如果是:

char q[]= "hello ";
char *p=q;
f(p);

现在在f函数里相当于: char *s=p; 那么也就是s指针指向了p,p又指向数组q, 现在在f里面如

果*s= 'y '也就相当于*p= 'y ',即q[0]= 'y '了,修改了!

修改的是谁? 是数组的内容.

实参是谁? 实参是指向数组的指针.

再来: 在f里面这样做: s++;*s= 'n '; s指向的是数组首地址,s++后s指向了下一个地

址,*s= 'n '也就相当于q[1]= 'n '了, 但是注意, p并没有移动,所以实参p并没有改变.


这也就是所谓的,s是p的一份拷贝,

总之,不好说懂. :(



[解决办法]

所谓一份拷贝,就是在函数调用时,将参数入栈,我们对形参的任何修改都是修改到
栈上的个拷贝,并不影响我们的实际参数.

任何编程语言的参数传递实际上都是在做传值调用.
所谓的传指针,就是把指针指向者的地址(一个值)传进函数.
也就是那个地址被压栈.
然后我们再通过这个地址进行操作,因为实参和形参同样都是一个地址的值.
所以改变形参指向者的状态时,实参指针也能看到这种变化.

读书人网 >C++

热点推荐