почему использование const при передаче аргументов дает мне предупреждение? - PullRequest
2 голосов
/ 08 сентября 2011

Почему этот код выдает предупреждение: передача аргумента 1 "test" из несовместимого типа указателя?Я знаю, что это о const до char **, но почему?

void test(const int ** a)
{
}
int main()
{
    int a=0;
    int *b=&a;
    int **c=&b;
    test(c);
    return 0;
}

Ответы [ 3 ]

5 голосов
/ 08 сентября 2011

Вы не можете присвоить int ** для const int **, потому что, если вы это сделаете, последний указатель позволит вам дать переменной int * адрес объекта const int:

const int myconst = 10;
int *intptr;
const int **x = &intptr;    /* This is the implicit conversion that isn't allowed */
*x = &myconst;              /* Allowed because both *x and &myconst are const int * ... */
/* ... but now intptr points at myconst, and you could try to modify myconst through it */
2 голосов
/ 08 сентября 2011
const int ** 

- это указатель на указатель на const int, но вы передаете указатель на указатель на int

Я думаю, что вы можете объявить тест с int ** const, который говоритчто указатель является константой, а не значением.

ПРИМЕЧАНИЕ: и я думаю, что это должно быть включено в каждый вопрос, касающийся указателей в C: cdecl.org - довольно хороший способ дать читаемое человеком выражение

0 голосов
/ 08 сентября 2011

Второй ответ на этот вопрос может быть полезен:

Почему я не могу преобразовать 'char **' в 'const char * const *' в C?

К сожалению, принятый ответ не очень хорош и не объясняет причину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...