想问一问大家为什么这命名空间使用的三种方式在这里却只有第二张图的方法是正确的,难道是命名空间的三种方法内部其实也有什么区别吗
这篇文章很详细,分享出来给大家看看https://blog.csdn.net/kklovecode/article/details/132718478
变量的调用范围有区别吧
【相关推荐】
/* 使用动态分配内存的形式,用malloc
*/
int **array // array[M][N]
array = (int **)malloc(M * sizeof(int *));
for(int i = 0; i < M; i++) {
array[i] = (int *)malloc(N * sizeof(int));
}
// 释放
for(int i = 0; i < M; i++)
free(array[i]);
free(array);
/* 使用动态分配内存的形式,用new
*/
int **array // array[M][N]
array = new int*[M];
for(int i = 0; i < M; i++) {
array[i] = new int[N];
}
// 释放
for(int i = 0; i < M; i++)
delete [] array[i];
delete [] array;
不过按照这种形式实现的二维数组本质上已经不是我们之前说的传统的二维数组 了,采用此种方法定义的二维数组的结构如下图所示,这样的二维数组在堆上分配内存。也就是说这样实现的二维数组本质上已经是指针数组了。使用这样的方式分配二维数组空间之后,可以使用array[i][j]进行数组的读写操作没有问题,但是应该知道不同行的内存空间不一定连续。这是因为每一行的数组的内存都是使用malloc分配的,多次使用malloc分配的内存空间并不一定是连续的,这与在栈上分配的二维矩阵有着根本的不同,比如同样的对于顶底的二维数组array[3][4],不能再使用array[0][4]来访问array[1][0]了,这样会导致地址越界,就是因为地址不一定连续了。
参考博客:
https://blog.csdn.net/qq_26822029/article/details/85037209