【C/C++】指標步長——例題理解
阿新 • • 發佈:2020-07-17
連結地址:指標步長——例題理解
目錄
一、例題
下面程式的執行結果:
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]。
如果對您有幫助可以點贊、收藏、關注,將會是我最大的動力 ↩︎