首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-04 
关于指针作为函数参数的问题includeiostreamusingnamespacestdstructStudent{longnumberfloatscoreSt

关于指针作为函数参数的问题
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的一份拷贝,

总之,不好说懂. :(



[解决办法]

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

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

热点排行