【发布时间】:2019-06-18 02:40:16
【问题描述】:
首先,我浏览了这些链接以更好地帮助我理解多维数组以及如何在函数中传递它们
https://stackoverflow.com/a/17569578/10452758
http://c-faq.com/aryptr/pass2dary.html
https://jameshfisher.com/2016/12/08/c-array-decaying/
关于这些事情我心里还是有一些不清楚的地方,想问问
假设我们有一个像这样的二维数组
int mat[][COLS] = {{...}}
i) 我们知道,如果mat 的大小是固定的,即在编译时已知为int (*mat)[COLS],我们可以将其传递给函数。
在这里,mat 被称为指向整数数组的单个指针,即它指向整个整数数组,那么上面定义的 main 函数中的 mat 将被称为相同,即指向整数数组的单个指针还是根本不是指针???但是将mat 打印到控制台会给出一个地址,所以基本上它是一个指针。
如int arr[] = {}的情况,我们说arr是第一个元素的地址,mat可以说什么。
我理解 b/w mat 和 mat[0] 的区别,但是为什么指向整个数组的指针和指向数组第一个元素的指针具有相同的值。在取消引用指针的情况下,如何知道它是指向第一个元素或整个数组的指针???
我知道这个问题听起来有点含糊,但我只是想知道为什么mat 和mat[0] 指向内存的相同地址,因为如果它们表示不同的东西,它们不会有不同的值吗???
如果有人可以分享他们对mat 所指的指针的了解,那将非常有帮助。
我已经阅读了关于这些主题的其他 SO 问题,但这些事情仍然没有引起我的注意。
ii) 我们知道 C 中的数组基本上不是指针,但是当我们访问数组的值时,它会衰减为指针类型的值。所以基本上我想问的是int arr[] = {...},arr 是否不是指针,我想用sizeof(arr)!=size_occupied_by_pointer 支持它,当我们定义mat 并且当我们在控制台中打印它们时也是如此衰减的指针值被引用。这是第一个问题的答案???
iii) 我的其他疑问是将矩阵作为指针传递给指针。 这是我倾向于遵循的代码,但会导致分段错误。如果有人能指出错误 -
void process_pointer_to_pointer(int **arr, size_t rows, size_t cols){
for (size_t i = 0; i < rows; ++i){
std::cout << i << ": ";
for (size_t j = 0; j < cols; ++j)
std::cout << arr[i][j] << '\t';
std::cout << std::endl;
}
}
int main(int argc, char const *argv[]){
const int m=4, n=4;
int mat[][n]= {
{1, 3, 1, 5},
{2, 2, 4, 1},
{5, 0, 2, 3},
{0, 6, 1, 2}
};
int *ip = &mat[0][0];
process_pointer_to_pointer(&ip, m, n);
我知道通过使用指针数组并用 mat[i] 填充指针数组来做同样事情的更简单方法,但我遵循此方法的限制并从此处尝试此方法
http://c-faq.com/aryptr/pass2dary.html
但没有得到想要的结果...
PS:这个问题可能完全无处不在,所以如果不能理解特定的东西,请问我。我很高兴进入辩论模式。另外,我是编码新手,所以请让我放松一下。 :p
【问题讨论】:
-
geeksforgeeks.org/pointer-array-array-pointer。这对我帮助很大,但仍然不明白为什么 mat 和 mat[0] 具有相同的地址值??
-
int **arr在传递二维数组时不正确。数组不会衰减为 2D 指针。我的解决方案是不使用原始二维数组。你可以使用std::array吗?另一种选择是提供一维数组和一个将二维索引转换为一维索引的函数 (row*numberColumns + column)。 -
@user4581301 我知道将指针传递给指针是不正确的,但你可以参考stackoverflow.com/a/17569578/10452758的第四点
-
mat是数组开头的地址。mat[0]也是数组开头的地址,因为第一个元素从数组的开头开始。 -
mat、mat[0]和mat[0][0]的地址相同。它们是矩阵中第一个元素的地址。但是,每种类型的类型不同。
标签: c++ arrays pointers multidimensional-array