指针和多维数组


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值