Why!!!!!!!!!!I don't think it can run!

Arhero 2004-11-10 08:39:58
我在编程时遇到一个非常费解的问题。
我认为基类指针(b++)->i会出现如(b+i)->i的东东,竟然是很规矩的0
以为base还自己留了个的数据块。结果运行derives[i].Base::i。发现没有。
现在我非常想知道(b++)->i的0是怎么来的。大虾救命呀。我刚从java过来。不懂呀!
#include <iostream>
using namespace std;

class Base{
public: int i;
};
class Derived:public Base{
public :int n;
Base b[10];


};
int main()
{
Derived derives[5];
Derived *derive;
derive=derives;
for(int i=0;i<5;i++)
{
derives[i].i=i;
}
Base *b;
b=derives;
//b++;
// b++;
cout<<"\n*b:(b++)->i:";
for(int i=0;i<5;i++)
{
cout<<" "<<(b++)->i;
}
cout<<"\n derives[i] : \n";

for(int i=0;i<5;i++)
{
cout<<" "<<derives[i].i;
}
cout<<"\n Other writing method : (b+i)->i\n";
for(int i=0;i<5;i++)
{
cout<<" "<<(b+i)->i;
}
cout<<"\n output derived : (derive+i)->i\n";
for(int i=0;i<5;i++)
{
cout<<" "<<(derive+i)->i;
}
cout<<"\n output derived : (derive++)->i\n";
for(int i=0;i<5;i++)
{
cout<<" "<<(derive++)->i;
}

cout<<"\n Some doubt, Why b++->i output is 0?Then the derives[i].base::i?:\n";
for(int i=0;i<5;i++)
{
cout<<" "<<derives[i].Base::i;
}








// cout<<b->i;
cout<<"\n";
return 0;
}
输出:

*b:(b++)->i: 0 0 0 0 0
derives[i] :
0 1 2 3 4
Other writing method : (b+i)->i
0 -12615240 -12845056 -12845056 -1
output derived : (derive+i)->i
0 1 2 3 4
output derived : (derive++)->i
0 1 2 3 4
Some doubt, Why b++->i output is 0?Then the derives[i].base::i?:
0 1 2 3 4
...全文
96 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Arhero 2004-11-10
  • 打赏
  • 举报
回复
Thanks freefalcon(心宇—小小菜鸟想高飞) and chinadragonss(独孤俊) :>
Arhero 2004-11-10
  • 打赏
  • 举报
回复
to:->freefalcon(心宇—小小菜鸟想高飞):
能帮我解释下吗?后面的0不是指向第一个元素。因为我把第一个设为10后,输出结果为:
10,0,0,0,0
:〉
Arhero 2004-11-10
  • 打赏
  • 举报
回复
to:->freefalcon(心宇—小小菜鸟想高飞):
多谢了.不过这次b->i全部是0了有些奇怪!
chinadragonss 2004-11-10
  • 打赏
  • 举报
回复
cout<<"\n*b:(b++)->i:";
for(int i=0;i<5;i++)
{
cout<<" "<<(b)->i << '\t';
b = (Base *)((char *)b + sizeof(Derived));

}
改成这样就能到正确结果。
chinadragonss 2004-11-10
  • 打赏
  • 举报
回复
改成下面,可得同样结果,至于 (b++)-〉i的内容不对,请察看c++对象模型那本书。
Base *b;
Base *b1;
b=derives;
b1=derives;
cout<<"\n*b:(b++)->i:";
for(int i=0;i<5;i++)
{
cout<<" "<<(b++)->i << '\t';

}

cout<<"\n Other writing method : (b+i)->i\n";
for(int i=0;i<5;i++)
{
cout<<" "<<(b1+i)->i << '\t';

}

chinadragonss 2004-11-10
  • 打赏
  • 举报
回复
for(int i=0;i<5;i++)
{
cout<<" "<<(b++)->i;
}
这里的b++,移动指针本身,b往下移动。
当你在下面再用(b+i)->i 时,此时的b已经不是刚才的b了。
Arhero 2004-11-10
  • 打赏
  • 举报
回复
to:->freefalcon(心宇—小小菜鸟想高飞):
我想知道(b++)->i 和(b+i)->i等价吗?如果等价为什么输出不同?
如果不等价,那么为什么(derive++)->i和(derive+i)->i又似乎等价。
请指点一二:〉
freefalcon 2004-11-10
  • 打赏
  • 举报
回复
java里没有指针的概念,但C/C++里指针却是一个很重要的东东

指针是指向其他内存块(数据)的一种变量,指针的类型决定了如何解释这块内存数据,即决定了如何访问数据,以及这块数据有多大

指针的++操作,是在原地址基础上加上一个其所指对象的大小

所以char*指针每++一次就移动1字节,short*型每++一次移动2字节,int*为4字节(当然,这和系统有关)

那么Base*和Derived*的区别应该明白了吧

64,676

社区成员

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

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