【发布时间】:2020-09-24 18:08:19
【问题描述】:
我在编写带有矩阵的程序时遇到了这个问题,我使用int** m 来声明我的矩阵 - 因为我需要动态分配并且在函数中我使用了int a[][]。我不记得有任何问题。但是当我使用简单的m[6][6] 矩阵和f(int**m, int** m2, rest params) 时,我遇到了麻烦。
它已编译,当我运行程序(使用 GCC 的代码块)时,它就崩溃了。我尝试通过添加printf()s 进行调试,它在if() 块处崩溃,崩溃没有意义。将第一个函数参数从 int a[][] 修改为 int* a[6] 并继续前进,稍后修改了第二个参数,我的程序在第一次尝试时工作。通过更仔细地调试我保存在 int m[i][j] 中的内容并检查 if 是垃圾值,而不是我输入的内容,我只是输入了 1 或 0 来标记一些东西。
这么多年过去了,除非我在做这样的事情时遇到 GCC 的编译器错误,否则我只会写我想到的第一种方式。
在所有 4 种组合中使用 int** 和 int [][] 声明变量/获取函数参数背后的逻辑是什么?我使用的大多数预定义函数在函数头中使用int**。
我知道int [][] 不等于int**,它是int* [] 正确,但是我缺少什么? int[][] 是一个多维数组,表示数组的数组,所有 3 种写法看起来都一样。而对于int[][],它几乎总是要求只让第一个参数无效,比如对于int array[][][][],我需要在函数参数中放入int array a[][n1][n2][n3],对吗?它需要知道除第一个以外的多维数组的维度,因为int*和int[]在声明函数参数时可以毫无问题地使用?
【问题讨论】:
-
我使用
int**m 来声明我的矩阵int **没有创建二维数组。阅读:Correctly allocating multi-dimensional arrays -
经过多年的痛苦,我意识到在 c++ 中实际上永远不需要
int**或int[][],这就是 c++ 开始变得有趣的时候。我很高兴我不必使用 C ;)
标签: c++ c function pointers parameters