1. 程式人生 > 實用技巧 >【C/C++】指標步長——例題理解

【C/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

A和B你會選擇哪一個呢?

二、解析

正確答案為B,是不是很疑問呢

首先明確, A類 大小為 4位元組;B 類大小為 8位元組
因為B繼承自A,基類A有一個long,4位元組,派生類B繼承A的long加上自身定義了一個long,4+4=8個位元組。

所以,A類指標+1移動4位元組,B類指標+1移動8位元組,所以A類指標和B類指標的移動步長不相同

void seta(A* data, int idx) {
    data[idx].a = 2;
}

由程式碼可知,此處傳入的實參為B類,而形參卻為A類,所以這裡就是使用基類A類指標來操作,子類B類的資料。
因為A類和B類指標步長不同的原因,就會出現指標實際操作的目標地址,與想象中的目標地址不相同

下面展示,此例題中,因為指標步長不同的原因,所對應的操作地址

因此每執行一次此函式,就會進行4位元組對應地址的資料替換。

seta(data, i);

所以答案就為22221111
因此類推,若將此函式void seta(A* data, int idx);中的A類改為B類,就不會存在指標步長不同的問題,答案就會是21212121

   

如有不足之處,還望指正 [1]


  1. 如果對您有幫助可以點贊、收藏、關注,將會是我最大的動力 ↩︎