二维数组和指针之间的关系详解

一、引言

说起二维数组可能首先想到的是各种嵌套的for循环,二维数组的初始化,二维数组的赋值,二维数组的输出等各种问题,当然了,数组的问题永远离不开指针,而二维数组所能联系到的就是二维指针了,此文则是着重讲解二维数组与二维指针之间的关系。

二、初始化与赋值

#define M 4
#define N 5
int arr[M][N]  = {{2,3,4,5},{3,5,},{6,},{9,8}};
但是大多数情况下,我们一般是如下的操作:

int arr[M][N] = {0};
for(int i = 0; j < M; i++)
{
for (int j = 0; j < N; j++)
{
    a[M][N] = i * j + j;
}
}
这样的操作是没什么问题的,但是我们有时候,我们的M和N并不一定是常量,大多数情况下是一个变量的话,我们需要动态的在堆上new一个数组出来,则需要做如下的代码:

int M = 5; int N = 4;
int **p = new *int[M];   //此处p指向每个int数组指针的首地址
for (int i = 0; i < M;i++)
{
 p[i] = new int[N];   //每个数组指针又指向一个int数组,或者这样写
  //*(p+i) = new int[N];
}
而我们释放这块堆内存的时候可以入下面这样写:

for(int j = 0; j < M; j++)
  delete [] p[j];
   delete [] p;
三、数组和指针之间的关系
二维数组和二维指针有千丝万缕的关系,可以这样建立两者之间的关系,

如下面的代码所示,两两的代码是等价的:

#include <iostream>

int main(void)
{
	int a[4][5] = {2,3,4,5,6,7,8,9};
	int (*p)[5];
	p = a;

	std::cout << "p = " << p << " and ";
	std::cout << "a = " << a<< '\n';
	std::cout << "p + 1 = "<< p + 1 << " and ";
	std::cout << "&(a[1]) = " << &(a[1]) << '\n';
	std::cout << "*p = " << *p << " and ";
	std::cout << "a[0] = "<< a[0] << '\n';
	std::cout << "*(p+1) = "<< *(p+1) << " and ";
	std::cout << "a[1] = "<< a[1] << '\n';
	std::cout << "**p = "<< **p << " and ";
	std::cout << "a[0][0] = "<< a[0][0]<< '\n';
	std::cout << "*(*p + 1) = "<< *(*p + 1) << " and ";
	std::cout << "a[0][1] = "<< a[0][1] << '\n';
	std::cout << "*(*(p + 1)) = "<< *(*(p + 1))<< " and ";
	std::cout << "a[1][0] = "<< a[1][0]<< '\n';
	std::cout << "*(*(p + 2) + 1) = "<< *(*(p + 2) + 1)<< " and ";
	std::cout << "a[2][1] = "<<a[2][1]<< '\n';
	std::cout << "*p = " << *p << " and ";
	std::cout <<"&(**p) = "<< &(**p) << '\n';

	getchar();
}
输出为:


下图中详细的描述了各级指针之间的关系,以及与数组之间的关系。

四、上述我们总结了二维数组与二维指针之间的关系,在此做一个记录,以备后续查看。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值