C++指针步长

下面程序执行结果

class A{
    public:
        long a;
};
class B : public A {
    public:
        long b;
};
void seta(A* data, int idx) {
    data[idx].a = 2;
}
int main(int argc, char *argv[]) {
    B data[4];
    for(int i=0; i<4; ++i){
        data[i].a = 1;
        data[i].b = 1;
        seta(data, i);
    }
    for(int i=0; i<4; ++i){
         std::cout << data[i].a << data[i].b;
    }
    return 0;
}

A 21212121
B 22221111

sata 传入A*时,结果为22221111
sata 传入B*时,结果为21212121

或者在程序里强行将data转成B*赋值: ((B*)data).a = 2,结果也是212121。

原理是:和指针的步长取决于指针指向变量类型的内存大小。
T* P;
P + 1(步长) => P + 1*sizeof(T)
展示评论