关于指针作为函数参数的问题
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的一份拷贝,
总之,不好说懂. :(
[解决办法]
所谓一份拷贝,就是在函数调用时,将参数入栈,我们对形参的任何修改都是修改到
栈上的个拷贝,并不影响我们的实际参数.
任何编程语言的参数传递实际上都是在做传值调用.
所谓的传指针,就是把指针指向者的地址(一个值)传进函数.
也就是那个地址被压栈.
然后我们再通过这个地址进行操作,因为实参和形参同样都是一个地址的值.
所以改变形参指向者的状态时,实参指针也能看到这种变化.