指向作为输入参数的指针(2D数组)的指针

Pointer to a pointer (2D array) as input parameter

本文关键字:指针 数组 2D 参数 输入      更新时间:2023-10-16

我两个月前开始在大学学习C++,我正试图找出如何将动态2d数组(指针对指针)作为输入参数传递给函数。我有一个动态二维阵列:

int **p;
p = new int*[R];
for(i=0; i<R; i++)
    p[i] = new int[C];

现在,我想使用const将这个指针p作为输入参数传递给一个函数。我的意思是,我希望函数不能修改矩阵的元素。

我试过了:

void func(const int **p) {
}

但我得到了这个错误:

main.cpp:19:11:error:从"int**"到"const"的转换无效int**'[-fpermission]

main.cpp:9:6:错误:初始化"void func(const int**)"[-fpermission]的参数1

我试着使用typedef,它是有效的,但它不是恒定的。如果我喜欢的话:

typedef int** abc;
void func(const abc p);
main() {
abc p;
...
func(p);
}

源编译,但函数"func"能够修改"p矩阵"的值;我希望p是一个输入参数,它必须是只读的!

请问,我如何将指针传递给将元素标记为只读的函数?

提前感谢你的帮助,并为我糟糕的英语感到抱歉。

您的const int **p应该是const int * const *p。从const int **int **的转换不允许是隐式的,因为它可能会违反所指向值的常量。要了解原因,请查看以下取自C标准的代码摘录(§6.5.16.1):

const char **cpp;
char *p;
const char c = 'A';
cpp = &p;       // constraint violation
*cpp = &c;      // valid
*p = 0;         // valid

如果cpp = &p是一个有效的赋值,那么随后的代码将能够将c的值设置为0,尽管该值是const char

void func(const int * const *p) {
}

试试这个:

typedef const int *cint_ptr_t  ;
void func(const cint_ptr_t  *p) {
}

请记住,您希望常量2D数组的元素指向每行开头的指针