假设我有一个QStrings数组和一个QString指针。我想使用指针迭代整个数组;我可以这样做吗?
QString * strPointer;
QString data[100];
strPointer = & data[0]; //address to first element
strPointer ++; //address to second element
这是有效还是我做错了什么?
答案 0 :(得分:2)
你说的是正确的。这是一种方式
QString data[100];
for (QString* strPointer = &data[0]; strPointer != &data[100]; ++strPointer)
{
...
}
答案 1 :(得分:1)
是的,只要指针的类型与数组中实际指向的内容相匹配,这就没问题了。通过递增指针,您正在执行指针运算。
值得注意的是,因为标准库中的迭代器被编写为外观&在许多方面感觉像指针,并且所有标准库算法都将迭代器指定为模板参数,将这些算法与原始指针一起使用也是合法且定义良好的。例如,这是完全合法的,即使你的指针:
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") );
答案 2 :(得分:0)
是的,确实如此。记住关于检查索引 - 运算符++可以“太远” - 超出数组。
答案 3 :(得分:0)
是的,递增指向数组元素的指针将产生一个指向下一个元素的指针或一个超过数组末尾的位置。
添加或减去具有整数类型的表达式时 从指针开始,结果具有指针操作数的类型。如果 指针操作数指向数组对象的元素和数组 足够大,结果指向一个偏离的元素 原始元素使得下标的差异 结果和原始数组元素等于整数表达式。 换句话说,如果表达式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