Эти вопросы были рассмотрены здесь.
Предлагаемый дубликат и текущие ответы не учитывают, почему нет проблем с приведенными первыми примерами. В основном, почему не рассуждение:
"const int ** is a pointer to const int *
что отличается от просто int*
"
также подать заявку на:
"const int * is a pointer to const int
, что отличается от просто int
"
Я подхожу к этому под другим углом, чтобы, надеюсь, получить другое объяснение.
Код с примерами.
#include <stdio.h>
void f_a (int const a){
/*
* Can't do:
* a = 3; //error: assignment of read-only parameter ‘a’
*
* Explanation: I can't change the value of a in the scope of the function due to the const
*/
printf("%d\n", a);
}
void f_ptr_a_type1 (int const * ptr_a){
/*
* Can do this:
* ptr_a’ = 0x3;
* which make dereferencig to a impossible.
* printf("%d\n", * ptr_a’); -> segfault
* But const won't forbid it.
*
* Can't do:
* *ptr_a’ = 3; //error: assignment of read-only parameter ‘* ptr_a’
*
* Explanation: I can't change the value of a by pointer dereferencing and addignment due to the int const
*/
}
void f_ptr_a_type2 (int * const ptr_a){
/*
* Can do this:
* *a = 3;
*
* Can't do:
* ptr_a = 3; //error: assignment of read-only parameter ‘ptr_a’
*
* Explanation: I can't change the value because the const is protecting the value of the pointer in the funcion scope
*/
}
void f_ptr_ptr_a (int const ** ptr_ptr_a){
/*
* Can do this:
* ptr_ptr_a = 3;
* * ptr_ptr_a = 0x3;
*
* Can't do:
* ** ptr_ptr_a = 0x3; //error: assignment of read-only parameter ‘**ptr_a’
*
* Explanation: Makes sense. Just follows the pattern from previous functions.
*/
}
int main()
{
int a = 7;
f_a(a);
int * ptr_a = &a;
f_ptr_a_type1(&a);
f_ptr_a_type2(&a);
int ** ptr_ptr_a = &ptr_a;
f_ptr_ptr_a(ptr_ptr_a); //warning: passing argument 1 of ‘f_ptr_ptr_a’ from incompatible pointer type [-Wincompatible-pointer-types]
}
Принятый широко принятый ответ выглядит примерно так:
int ** не то же самое, что const int**, и вы не можете безопасно использовать его
Мой вопрос: почему эта функция вдруг заботится?
Здесь не жаловались, что int
не int const
:
int a = 7;
f_a(a);
Здесь он не жаловался, потому что int *
не является ни int const *
, ни int * const
:
int * ptr_a = &a;
f_ptr_a_type1(&a);
f_ptr_a_type2(&a);
Но вдруг он начинает жаловаться в случае двойного указателя.
Ищете объяснения, используя эту терминологию и пример?
Почему функция вдруг начинает беспокоиться о правах на запись чего-то, что находится за пределами ее области действия?
const char **
какconst * char *
, что представляет собой другую сторону одной и той же медали. - person David C. Rankin   schedule 15.07.2017