免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2283 | 回复: 14
打印 上一主题 下一主题

不解,C++,各位指点 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-27 14:56 |只看该作者 |倒序浏览
下面是个简单的程序,有点问题,请教一下:

#include<iostream>
using namespace std;

class Student
{
      public:
             Student(int n,int s):num(n),stu(s){}
             void display()
             {
                  cout<<"num="<<num<<" "<<endl;
             }
             friend void test(Student *);
      private:
      int num;
      int stu;
};

void test(Student *p)
{
     
     p++;                               //这里已经改变了p的地址;
}

int main()

{
    Student stu[2]=
    {
            Student(1,2),
            Student(2,3)
    };
   
    Student *p=stu;
    p->display();
   
    test(p);
    p->display();                   //为什么这里没有传回来啊?输出P仍然是指向stu[0]?
   

   
   
}

论坛徽章:
0
2 [报告]
发表于 2006-08-27 15:16 |只看该作者

  1. void test(Student** p)
  2. {
  3.      
  4.      (*p)++;
  5. }

  6. int main()

  7. {
  8.     Student stu[2]=
  9.     {
  10.             Student(1,2),
  11.             Student(2,3)
  12.     };
  13.    
  14.     Student *p=stu;
  15.     p->display();
  16.    
  17.     test(&p);
  18.     p->display();
  19. }
复制代码

this should work

[ 本帖最后由 isjfk 于 2006-8-27 15:17 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-08-27 15:29 |只看该作者
还是传值传指针的问题

论坛徽章:
0
4 [报告]
发表于 2006-08-27 15:40 |只看该作者

回复 1楼 ballfan_123 的帖子

/****************
void test(Student *p)
{
     
     p++;                               //这里已经改变了p的地址;
}
**********/

p入栈和出栈后其位置并没有变化,你在函数内部能做的只是修改p指向的内存的值,它本身的位置你是改变不了的,通过双指针或则引用可以解决你的问题。

论坛徽章:
0
5 [报告]
发表于 2006-08-27 15:50 |只看该作者
原帖由 isjfk 于 2006-8-27 15:16 发表
[code]
void test(Student** p)
{
     
     (*p)++;
}

int main()

{
    Student stu[2]=
    {
            Student(1,2),
            Student(2,3)
    };
   
    Student *p=stu;
    ...



为什么要用双重指针啊,不大明白,可以解释一下吗? 不是p就是代表stu的地址吗

论坛徽章:
0
6 [报告]
发表于 2006-08-27 15:55 |只看该作者
原帖由 Arfei 于 2006-8-27 15:40 发表
/****************
void test(Student *p)
{
     
     p++;                               //这里已经改变了p的地址;
}
**********/

p入栈和出栈后其位置并没有变化,你在函数内部能做的只是修改p指 ...




#include <iostream>
using namespace std;
class Student
{
      public:
      Student(int n,float s):num(n),score(s){}
      void display();
      friend int max_score(Student *);
      
      private:
      int num;
      float score;
};

void Student::display()
{
     cout<<"num="<<num<<" "<<"score="<<score<<endl;
}

int max_score(Student *p)
{
     Student *p1=p;
     p++;
     
     for(int i=0;i<4;i++,p++)
     {      
             if(p->score>p1->score)
             p1=p;
     }                                                        //这只是找出最大的那个数;
     
     cout<<"maxnum="<<p1->num<<endl;
     
     p->score=p1->score;
     p->num=p1->num;                              //我已经改了p->num的值,为什么下面输出还是没有改?
         
}                                                               //当我把整个函数体换作,p->num=200的时候,输出又
                                               能改变,为什么啊?

int main()
{
   
    Student stud[5]={
  Student(101,78.5),
  Student(102,85.5),
  Student(103,98.5),
  Student(104,100.0),
  Student(105,95.5)
};

Student *p=stud;


  max_score(p);
  p->display();
  
  
  
return 0;
}

论坛徽章:
0
7 [报告]
发表于 2006-08-27 16:53 |只看该作者
指针也是一个变量,本质上说只是几个字节的数据,跟 int 没什么区别。只不过指针和变量的行为不同。

如果你打算在 B 函数里改变 A 函数里的变量,你就得在调用 B 函数时传递变量的地址。指针变量也一样

你上面的程序也是因为 max_score 函数中对指针的改变并没有影响到 main 函数中的指针变量。因为调用 max_score 函数时传递的是指针的值而不是地址,所以 max_score 函数无法改变 main 函数中的指针。

[ 本帖最后由 isjfk 于 2006-8-27 16:57 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-08-30 11:48 |只看该作者
很简单,就象楼上说的,指针也是一个变量 你把它作为参数传进函数里

函数里面会拷贝一个和它一样的指针,它的指向的位置是一样的。

你在函数里面修改的这个指针 只是它函数里的拷贝。跳出这个函数,指针的参数拷贝就不存在了。
当然它本身是不会被修改的。

假如你修改的是它指向位置的值。值当然是被修改了。

论坛徽章:
0
9 [报告]
发表于 2006-08-30 12:58 |只看该作者
should be:

  1. void test(Student*& p)
  2. {
  3.      
  4.      p++;                               //这里已经改变了p的地址;
  5. }
复制代码

论坛徽章:
0
10 [报告]
发表于 2006-08-30 13:53 |只看该作者
受教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP