指针和多维数组

    技术2026-04-20  14

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

    Processed: 0.008, SQL: 10