2017-06-29 104 views
0

假设传递指针数组作为参数为const

int a = 1; 
int b = 2; 
int c = 3; 

int * A[3] = {&a, &b, &c}; 

我不知道为什么,这是允许的:

void arrFunc1(int * const * arg) 
{ 
} 

而且这个人是不是:

void arrFunc2(int const ** arg) 
{ 
} 

在a:

int main(void) 
{ 
    arrFunc1(A); // OK 
    arrFunc2(A); // Not OK 

    return 0; 
} 

我知道这两者之间的区别。第一个函数将假定指针本身是常量并且不能被改变,第二个函数假定这些指针指向的整数不能被改变。但我想知道为什么第二个功能是不允许的?我看不出有什么理由可以破坏任何东西。

+0

好的,我在提出的“重复问题”中找到了答案。这是解释[这里](http://c-faq.com/ansi/constmismatch.html)感谢大家 – Gattuso

+0

基本上,你可以转换(分配)“T”为“const T”,并且“T *”为'const T *',但是它停在这里,不能再继续下去了,把'T **'改成'const T **',原因在上面的链接中解释。 – Gattuso

回答

0

因为与int const ** arg你说arg是一个指针的指针到const int,但abc没有const int变量。

随着int * const * arg你说arg是一个指向常量指针int。即你不能改变例如arg[0]指向。

+0

是的,'a','b'和'c'不是'const int',但是这并不妨碍我调用一个假设它们是const的函数,比如'void func(const int a) '。在我的情况下,我添加了一个间接层,但我所要求的仍然完全一样,我看不出它是如何破坏任何东西的 – Gattuso