二维数组和指针之间的关系详解
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();
}输出为:
![](http://img.blog.csdn.net/20170909141051385?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJsbWVtb3J5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
下图中详细的描述了各级指针之间的关系,以及与数组之间的关系。
![](http://img.blog.csdn.net/20170909141103455?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJsbWVtb3J5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
四、上述我们总结了二维数组与二维指针之间的关系,在此做一个记录,以备后续查看。
说起二维数组可能首先想到的是各种嵌套的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();
}输出为:
下图中详细的描述了各级指针之间的关系,以及与数组之间的关系。
四、上述我们总结了二维数组与二维指针之间的关系,在此做一个记录,以备后续查看。
相关文章推荐
- 解析二级指针与二维数组之间的关系
- 彻底搞清C/C++中一维数组,二维数组,指针,数组指针和指针数组以及指向指针的指针,行地址和列地址之间的关系
- 彻底搞清C/C++中一维数组,二维数组,指针,数组指针和指针数组以及指向指针的指针,行地址和列地址之间的关系
- 二维数组和指针之间的关系
- ALSA声卡驱动中的DAPM详解之五:建立widget之间的连接关系
- 指针与数组之间的关系与转换
- 二维数组与指针的关系及运用
- 关于基类与派生类之间对象、指针等转化关系的小结
- UML-用例、类图、类图之间的关系详解
- 数组与指针之间的微妙关系
- ALSA声卡驱动中的DAPM详解之五:建立widget之间的连接关系
- c/c++(疑3) C语言指针与数组之间关系
- react没有嵌套关系的组件之间通信方法详解
- C++ 指针,引用,普通变量之间的关系
- C语言中二维数组名与数组地址、首行地址、首行首元素地址关系与区别详解(初学者必须掌握)
- C语言学习历程(十一)二维数组与指针的关系
- 操作系统 页式存储 页与块之间的关系详解
- 判断元素之间的包含关系contains和compareDocumentPosition详解
- 创建Oracle数据库、数据库名与实例名与SID之间的关系(图文详解)
- 详解onInterceptTouchEvent和onTouchEvent之间的关系