比方說,我有一個QStrings和一個QString指針的數組。我想用指針遍歷整個數組;我可以這樣做嗎?我可以通過增加一個指針來移動數組嗎? Qt
QString * strPointer;
QString data[100];
strPointer = & data[0]; //address to first element
strPointer ++; //address to second element
這是有效的還是我做錯了什麼?
比方說,我有一個QStrings和一個QString指針的數組。我想用指針遍歷整個數組;我可以這樣做嗎?我可以通過增加一個指針來移動數組嗎? Qt
QString * strPointer;
QString data[100];
strPointer = & data[0]; //address to first element
strPointer ++; //address to second element
這是有效的還是我做錯了什麼?
你說得對。這裏有一種方法
QString data[100];
for (QString* strPointer = &data[0]; strPointer != &data[100]; ++strPointer)
{
...
}
我會用:(for(QString * strPointer = data; strPointer!= data + 100; ++ strPointer)'或者在C++ 11中:for(auto strPointer = std :: begin(data); strPointer! = std :: end(data); ++ strPointer)'甚至'for(auto str:data)'。隨意在你的答案中使用這些例子... – PiotrNycz
是的。記住檢查索引 - operator ++可能會「太遠」 - 超出數組。
是的,這是好的,只要指針的類型相匹配什麼實際被指出在數組中。通過增加一個指針,你正在執行指針算術。
這可能是有趣的是,由於標準庫中的迭代器寫入看起來&感覺像在許多方面指針,所有的標準庫算法採取指定爲模板參數迭代器,它是合法的和明確的,以也可以使用這些算法與原始指針。例如,這是完全合法的,即使你的指針:
const size_t num_data = sizeof(data)/sizeof(data[0]);
std::copy(&data[0], &data[num_data], ostream_iterator<QString>(cout,"\n"));
...假設你當然已經實現operator<<
了QString
對象。
現在,這一切都這樣說,看看這個:
QString data[100];
的這裏100
是什麼叫做Magic Number。 Magic Numbers的使用被廣泛認爲是anti-pattern,或者是一種不好的做法。問問你自己幾個問題:
最好避免在任何地方使用幻數。你在這裏的選擇100
是任意的。最好使用在添加和刪除對象時增長和縮小的集合類型。 std::vector
是一個良好的開端:
std::vector<QString> data;
現在你可以添加物品:
data.push_back(...);
...刪除它們,並輕鬆地重複,使用迭代器:
std::copy(data.begin(), data.end(), ostream_iterator<QString>(cout,"\n"));
是,遞增一個指向數組元素的指針會產生一個指向下一個元素的指針或者一個指向數組末尾的位置。
當具有整體式的表達式添加到或從一個指針減去 ,其結果具有指針操作數的類型。如果 指針操作數指向數組對象的元素,並且數組 足夠大,則結果指向與原始元素偏移的元素,以使得結果數組元素和原始數組元素的下標之差等於積分表達。 換句話說,ifthe表達P指向到一個 陣列對象的第i個元素,表達式(P)+ N(等效地,N +(P))和(P)-N (此處N值n )指向,分別第i +第n和I - 陣列對象的第n個元素,只要它們存在。此外,如果 公式P指向數組對象的最後一個元素時, 表達(P)1點中的一個過去的數組對象, 的最後一個元素並且如果所述表達Q點的一個過去的最後一個元素陣列 對象,表達式(Q)-1指向的數組 對象的最後一個元素。如果這兩個指針操作數和結果指向元件相同的數組對象的 ,或一個過去的陣列 對象的最後一個元素時,評價不得產生溢出;否則, 行爲是不確定的。
— [expr.add 5.7/5
它是有效的,到目前爲止,但你有沒有穿過整個陣列好了嗎。 – john
爲什麼不試試呢? :) – 2012-10-19 14:45:43
我即將這樣做 – Amre