您的位置:首页 > 其它

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

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

二、初始化与赋值

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

for(int i = 0; j < M; i++)

{
for (int j = 0; j < N; j++)
{

    a[M]
= 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
; //每个数组指针又指向一个int数组,或者这样写
//*(p+i) = new int
;
}而我们释放这块堆内存的时候可以入下面这样写:
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();
}输出为:



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



四、上述我们总结了二维数组与二维指针之间的关系,在此做一个记录,以备后续查看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息