1

代码:

#include<iostream.h>
class base
{
   public:
   int bval;
   base(){ bval=0;}
};

class deri:public base
{
   public:
   int dval;
   deri() { dval=1; }
};

void SomeFunc(base *arr,int size)
{
   for(int i=0; i<size; i++,arr++)
       cout<<arr->bval;
   cout<<endl;
}

int main()
{
   base BaseArr[5];
   SomeFunc(BaseArr,5);

   deri DeriArr[5];
   SomeFunc(DeriArr,5);

   return 0;
}

输出:

00000
01010

我不明白为什么输出的第二行是 01010。这个程序只是为了学习目的,用 Turbo C++ 实现。

4

1 回答 1

4

SomeFunc期待一个数组base。在 main 的第一次调用中,您传递了一个 数组base,但在第二次调用中,您传递了一个deri. deri对象大于base对象,因此指针arr++中的第一个之后将不再指向对象。SomeFuncarrbase

base 的内存布局为:[int bval] deri
的内存布局为:[base, int dval]

DeriArr 是 [deri 0, deri 1, deri 2, deri 3, deri 4],所以
[base 0, int dval 0, base 1, int dval 1, base 2, int dval 2, base 3, int dval 3, base 4,int dval 4]
或细分:
[int bval 0,int dval 0,int bval 1,int dval 1,int bval 2,int dval 2,int bval 3,int dval 3,int bval 4,int dval 4 ]

SomeFunc 以指向数组开头的 arr 开头。这很好,但 ++arr 不会为一个 dval 对象(一个 int bval 和一个 int dval)推进指针,而只会为一个基础对象(仅一个 int bval)推进。正如您在 ++arr 之后看到的,arr 将指向 [int dval 0, ...]。

于 2013-08-14T09:55:02.603 回答