Sam*_*son 6 c++ arrays pointer-arithmetic
我了解它的大部分工作原理,除了main函数中的第二行:int* end = array+5;。那条线是如何工作的?
#inlcude <iostream>
int main()
{
int array[] = {10, 20, 29, 200, 2};
int* end = array+5;
for(int* it = array; it != end; ++it)
{
std::cout << *it << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
应该只打印列表中的每个元素。
it != end;
Run Code Online (Sandbox Code Playgroud)
表示它到达位置[5],该位置在最后一个(4)之后。
int* end = array + 5;
Run Code Online (Sandbox Code Playgroud)
只需创建一个指向该[5]位置的变量即可。
它可以工作,但是更干净,更安全的版本是:
for(int i = 0 ; i < 5 ; i++)
{
std::cout << it[i] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以将硬编码5替换为sizeof(array)/sizeof(int),或者甚至更好地使用std :: array。
std::array arr<int,5> = {10, 20, 29, 200, 2};
for(int i = 0 ; i < arr.size() ; i++)
{
std::cout << arr[i] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
要么
std::array arr<int,5> = {10, 20, 29, 200, 2};
for(auto& it : arr)
{
std::cout << it << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
后者的形式与原始数组一样快,但是更安全。
该变量array就像是指向包含数据的内存开头的指针。
的长度array为5,因此在开头加上5会得出结尾处1的位置。
start --|
10, 20, 29, 200, 2, (out of array)
|--- +5 -----------^
Run Code Online (Sandbox Code Playgroud)
条件it != end检查循环是否没有超出范围。
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |