int ia[3][4] = {
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
int(*p)[4] = ia;
for (auto p = ia; p != ia + 3; ++p)
{
for (auto q = *p; q != *p + 4; ++q)
{
cout << *q << " ";
}
cout << endl;
}
int *ip[4]表示的是整型指针数组
int (*ip)[4]表示的是指向含有4个整数的数组
先解释第一个代码片:外层的for循环首先声明一个指针p并令其指向ia的第一个内层数组,然后依次迭代直到ia的全部3行都处理完为止。其中递增运算++p负责将指针p移动到ia的下一行。
内层的for循环负责输出内层数组所包含的值。它首先令指针q指向p当前所在行的第一个元素。*p是一个含有4个整数的数组,像往常一样,数组名被自动地转换成指向该数组首元素的指针。内层for循环不断迭代直到我们处理完当前内层数组首元素的指针,给它加上4就得到了终止条件。
当然是用标准库函数begin和end看起来更加整洁
下面展示一些 内联代码片
。
for (auto p = begin(ia); p != end(ia); ++p)
{
for (auto q =begin( *p); q != end(*p) ; ++q)
{
cout << *q << " ";
}
cout << endl;
}
接下来我们看看(*p)[4]怎么输出
for (auto a = p; a != p+3; ++a)
{
for (auto c = *a; c != *a + 4; ++c)
{
cout << *c << " ";
}
cout << endl;
}
理论上和二维数组一样
但是他不能是用标准库函数begin和end
于是我查了一下函数源码
template <class _Ty, size_t _Size>
_NODISCARD constexpr _Ty* begin(_Ty (&_Array)[_Size]) noexcept {
return _Array;
}
template <class _Ty, size_t _Size>
_NODISCARD constexpr _Ty* end(_Ty (&_Array)[_Size]) noexcept {
return _Array + _Size;
}
我觉得虽然指针指向数组和二维数组的内容是一样的,但是容器本质还是不一样的,所以begin(ia)能够轻松识别他是二维数组;我要在第二种情况不出现错误的话给用begin(p[4])去表示。而且后面也不好表示了,
所以用标准库函数begin和end的时候指针就很难使用了。