事情就是这样。我可以完全理解一个多维数组的概念(让我们暂时考虑一下二维),由指向数组的指针等组成......
我们做这样的事情:
// we can use dynamically defined size n and m
int n = 3, m = 5 ;
int **T = new int *[n];
for (int i = 0 ; i < n ; ++i)
T[i] = new int[m];
我们得到的是:(检查我是否在这里)
- 3块5个整数的内存,放置在内存中的某处
- 一个额外的内存块,其大小与整数块的数量(行数)相同。该块是指向这些 int 行的指针数组(对于 int 类的指针通常为 4 个字节)。
- 我们最感兴趣的——即类型为 (**T) 的 T——一个指向指针的指针。这正是指向指针数组的指针,因为在 C++ 中,数组实际上是指向内存块的指针,因此 t[] 或 t[0] 表示 *t,而 t[x] 表示 *(t+ X)。
现在问题是当我们这样做时:
int n = 3, m = 5 ;
int T[n][m] ;
我们所拥有的不是 w 可以做我之前展示的事情。我们有点奇怪。什么是T?当 printfing T 时,我们得到与 T[0] 相同的值。看起来我们保留了一个大小为 n*m 的整数块,而没有额外的指向行的指针数组。
我的问题是:编译器是否记得数组的维度以及行数和列数?当要求 T[i][j] 它实际上要求 *(T+i*n+j) 所以这个 n 存储在某个地方?问题是当我们试图将这个东西(T)传递给一个函数时。我不知道为什么,但是如果 n 和 m 是常量,则可以将 T 作为指向该数组的指针传递,以像在该程序中一样运行:
#include <stdio.h>
const int n = 3, m = 4 ; // this is constant!
void add_5(int K[][m])
{
for (int i = 0 ; i < n ; ++i)
for (int j = 0 ; j < m ; j++)
K[i][j] += 5 ;
}
int main()
{
// n x m array the most straight forward method
int T[n][m] ;
for (int i = 0 ; i < n ; ++i)
for (int j = 0 ; j < m ; ++j)
T[i][j] = i*m + j ;
for (int i = 0 ; i < n ; ++i)
{
for (int j = 0 ; j < m ; j++)
printf("%d ",T[i][j]) ;
printf("\n") ;
}
printf("\n") ;
// adding 5 to all cells
add_5(T) ;
printf("it worked!!\n") ;
for (int i = 0 ; i < n ; ++i)
{
for (int j = 0 ; j < m ; j++)
printf("%d ",T[i][j]) ;
printf("\n") ;
}
int ss ;
scanf("%d",&ss) ;
}
但是如果 n 和 m 不是常数,我们不能。所以我需要将动态创建的多维数组的指针传递给一个函数,而无需为此手动分配内存。这该怎么做?