c - что означает это 2 const?

Код:

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 функциях, получите ошибку компиляции с подсказками.

2 ответа

Решение

Первый конст говорит, что вы не можете изменить *key, key[i] так далее

Следующие строки недействительны

*key = 'a';
*(key + 2) = 'b';
key[i] = 'c';

Второй конст говорит, что вы не можете изменить key

Следующие строки недействительны

key = newkey;
++key;

Также проверьте, как прочитать это сложное объявление


Добавляем больше деталей.

  1. const char *key: вы можете изменить ключ, но не можете изменить символы, указанные ключом.
  2. char *const key: Вы не можете изменить ключ, но могут символы, указанные ключом
  3. const char *const key: Вы не можете изменить ключ, а также символы указателя.

const [type]* означает, что это указатель, который не меняет указанное значение.[type]* const означает, что значение самого указателя не может измениться, т. е. он продолжает указывать на одно и то же значение, похожее на Java final ключевое слово.

Другие вопросы по тегам