2017-06-29 95 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