C++浅谈二维数组与指针

在C++中数组与指针有着紧密的联系,用指针对数组进行操作使得程序更加简洁高效,但是二者的衔接中往往会出现许多诸如格式,空间大小等方面不对应的问题,下面我将通过几个实例来简述二维数组与指针的关系。

首先来看最简单的将指针指向一维数组。

char a[10];			//先定义一个一维字符型数组a
char *p[10];		//这种定义得到的是指针数组,即整个数组中全部存放字符型指针
char (*p)[10];	//这样定义得到指向数组的指针
*p=a;

上例体现了一个很重要的注意点:运算符的优先级。指针运算符“*”的优先级是低于中括号的,所以如果不用小括号约束,p将会先与“[10]”结合,再去取指针,这样得到的就是指针数组,这一点在许多指向数组的指针定义中都会出现。

现在让我们来看如何让指针指向二维数组,对指向二维数组的指针的定义,主要有以下几种方式。
(1)指定行宽的指向方法

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
	int n[][3] = { 10,20,30,40,50,60 };
	int(*p)[3];
	p = n;
	cout << p[0][0] << "," << *(p[0] + 1) << "," << (*p)[2] << "," << p[1][1] << endl;

	return 0;
}

通过给出与二维数组n列数一致的指向数组的指针p,可以使p指向数组n,之后指针名p可以进行所有与数组名有关的操作。

这种指向思想是将二维数组视为一维数组操作,我们通过软件给出的对应关系也可以看出,如下图:

在这里插入图片描述
我们输入一个错误的指向格式,系统将会告诉我们这个指针希望指向一个什么格式的对象,显然使用这种方式定义的指向二维数组的指针,把列向量值固定为3,而只指向行向量,这样就将二维化为一维,实现了指针指向。

这样的指针可以像数组名一样,直接用中括号来选取所需元素

(2)指向元素的指向方法

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
	int n[][3] = { 10,20,30,40,50,60 };
	int *p=new int[10];
	p = &n[0][0];
	cout << *p << "," << *(p + 1) << "," << p[1] << "," << p[5] << endl;

	return 0;
}

这种方式定义的指针指向单个元素,与方法一的一大区别是定义的指针需要在定义时初始化一个容纳数组的空间(new int[10];),定义指针却不指定其空间是一个非常严重的错误。

这种方法下即使仍能以指针名+中括号的形式提取元素值,但需要注意,这样的指针是一维的,对应二维数组中元素的下标依行从左至右按顺序排列,这是与方法一使用指针提取元素最大的区别。方法一的指针可以使用双下标表示,也可以使用单下标表示,但方法二只能使用单下标。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值