2015-12-13 262 views
2

2个月前我开始在大学学习C++,并试图找出如何将动态二维数组(指向指针的指针)作为输入传递给函数参数。 我有这样的动态二维数组:作为输入参数的指针(二维数组)的指针

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

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

我想这样的:

void func(const int **p) { 
} 

,但我得到这个错误:

main.cpp:19:11: error: invalid conversion from 'int**' to 'const int**' [-fpermissive]

main.cpp:9:6: error: initializing argument 1 of 'void func(const int**)' [-fpermissive]

我tryied使用的typedef和它的作品,但它不是恒定的。 如果我做这样的:

typedef int** abc; 

void func(const abc p); 

main() { 
abc p; 
... 
func(p); 
} 

源编译,但功能“FUNC”是能够修改“P矩阵”的值;我希望p是一个输入参数,它必须是只读的!

请问,我该如何传递一个指针指向一个标记元素为只读的函数?

预先感谢您的帮助和歉意,我的英语不好。

回答

3

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

1

试试这个:

typedef const int *cint_ptr_t ; 

void func(const cint_ptr_t *p) { 
} 

请记住,你想成为常量您的二维数组的元素的指针每行开头

2
void func(const int * const *p) { 
} 
+0

你能否也请给我一个简短的解释呢?非常感谢。 – PeppeDAlterio