【发布时间】:2013-04-29 16:32:43
【问题描述】:
事情就是这样。 我完全可以理解一个多维数组的概念(让我们暂时考虑一下二维),由指向数组的指针等等......
我们这样做:
// 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 不是常数,我们不能。 因此,我需要将动态创建的多维数组的指针传递给函数,而无需为此手动分配内存。 如何做到这一点?
【问题讨论】:
-
如果你“完全理解”了这个主题,为什么还要我们“检查我是否正确”?
-
"因为在 C++ 中,数组实际上是一个指针" 这就是错误所在。数组不是指针。
-
我的意思是当我们创建一个数组时,我们得到的最直接的方法是一个指针(C++ 分配内存在一边,所以没有什么“真正”将该指针连接到这个数据块,除了它是value 是第一个单元格的地址。我们也可以更改指针的值。
-
通过说“我完全理解..”(阅读其余部分)然后写“检查我是否正确”,我想告诉你我是对的。就像当你说“嘿,我很强壮”然后举起重物来证明某人时......
-
@MichałKownacki “当我们创建一个数组时,我们得到的最直接的方法就是一个指针”——这就是你错的地方。你根本没有得到指针。你得到一个数组。数组和指针不一样。
标签: c++ function pointers multidimensional-array dynamically-generated