指针算术计算

问题描述 投票:0回答:1
#include <iostream>

using namespace std;

class temp {
    int a = 10;
};

class derived : temp {
    int b = 20;
};

int main()
{
    derived der;
    void * p = &der;
    cout<<"First element in der is : "<<*(int*)p<<endl;
    cout<<"(int*)p :"<<(int*)p<<endl;
    p += sizeof(int); //Way -1
    //p = (int*)p + sizeof(int); //Way-2
    cout<<"Second element in der is : "<<*(int*)p<<endl;
    cout<<"(int*)p :"<<(int*)p<<endl;

    return 0;
}

如果执行上面的代码,则会得到以下输出结果:

der中的第一个元素是:10(int *)p:0x7ffe9f05a928der中的第二个元素是:20(int *)p:0x7ffe9f05a92c

好像我在(Way-1)中注释代码行,而在(Way-2)中取消注释行我得到以下输出:

der中的第一个元素是:10(int *)p:0x7ffc10e6de18der中的第二个元素是:0(int *)p:0x7ffc10e6de28

第二次尝试出了什么问题?为什么这里的指针算术结果不同?

c++ pointer-arithmetic
1个回答
1
投票

执行此操作时:

void * p = &der;
int i = *(int*)p;

您(间接地)将derived指针转换为int指针。这将调用未定义的行为,并且程序可以打印任何内容。再次运行它甚至可以打印不同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.