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的时候指针就很难使用了。
