код:
const char * const key;
В указателе выше 2 const, я видел такие вещи в первый раз.
Я знаю, что первый const делает значение, указанное указателем, неизменным,
но сделал ли второй const указатель неизменным?
Кто-нибудь может помочь объяснить это?
@Обновить:
И я написал программу, которая доказала, что ответ правильный.
#include <stdio.h>
void testNoConstPoiner() {
int i = 10;
int *pi = &i;
(*pi)++;
printf("%d\n", i);
}
void testPreConstPoinerChangePointedValue() {
int i = 10;
const int *pi = &i;
// this line will compile error
// (*pi)++;
printf("%d\n", *pi);
}void testPreConstPoinerChangePointer() {
int i = 10;
int j = 20;
const int *pi = &i;
pi = &j;
printf("%d\n", *pi);
}
void testAfterConstPoinerChangePointedValue() {
int i = 10;
int * const pi = &i;
(*pi)++;
printf("%d\n", *pi);
}
void testAfterConstPoinerChangePointer() {
int i = 10;
int j = 20;
int * const pi = &i;
// this line will compile error
// pi = &j
printf("%d\n", *pi);
}
void testDoublePoiner() {
int i = 10;
int j = 20;
const int * const pi = &i;
// both of following 2 lines will compile error
// (*pi)++;
// pi = &j
printf("%d\n", *pi);
}
int main(int argc, char * argv[]) {
testNoConstPoiner();
testPreConstPoinerChangePointedValue();
testPreConstPoinerChangePointer();
testAfterConstPoinerChangePointedValue();
testAfterConstPoinerChangePointer();
testDoublePoiner();
}
Раскомментируйте строки в 3 функциях, получите ошибку компиляции с подсказками.
Первый конст говорит, что вы не можете изменить *key
, key[i]
так далее
Следующие строки недействительным
*key = 'a';
*(key + 2) = 'b';
key[i] = 'c';
Второй конст говорит, что вы не можете изменить key
Следующие строки недействительным
key = newkey;
++key;
Также проверьте как читать эту сложную декларацию
Добавляем больше деталей.
const char *key
: вы можете изменить ключ, но не можете изменить символы, указанные ключом.char *const key
: Вы не можете изменить ключ, но могут символы, указанные ключомconst char *const key
: Вы не можете изменить ключ, а также символы указателя.const [type]*
означает, что это указатель, который не меняет указанное значение.
[type]* const
означает, что значение самого указателя не может измениться, т. е. он продолжает указывать на одно и то же значение, похожее на Java final
ключевое слово.