const использование с указателями в C - PullRequest
18 голосов
/ 18 сентября 2009

Я перехожу через C и у меня есть вопрос относительно использования const с указателями. Я понимаю следующий код:

const char *someArray

Это определение указателя, который указывает на типы символов, а модификатор const означает, что значения, хранящиеся в someArray, не могут быть изменены. Однако что означает следующее?

char * const array

Является ли это альтернативным способом указания параметра, который является указателем на символ массива с именем «массив», который является const и не может быть изменен?

Наконец, что означает эта комбинация:

const char * const s2

Для справки, они взяты из книги программирования Deitel C в главе 7, и все они используются в качестве параметров, передаваемых функциям.

Ответы [ 6 ]

47 голосов
/ 18 сентября 2009

const char* - это, как вы сказали, указатель на символ, где вы не можете изменить значение символа (по крайней мере, не через указатель (без удаления константы)).

char* const - указатель на символ, где вы можете изменить символ, но вы не можете сделать указатель на другой символ.

const char* const - это постоянный указатель на постоянный символ, т. Е. Вы не можете изменить ни указатель, ни значение указателя.

16 голосов
/ 06 февраля 2010

От В чем разница между const int *, const int * const, int const *:

Читать в обратном направлении ...

int* - pointer to int
int const * - pointer to const int
int * const - const pointer to int
int const * const - const pointer to const int
13 голосов
/ 18 сентября 2009
//pointer to a const
void f1()
{
    int i = 100;
    const int* pi = &i;
    //*pi = 200; <- won't compile
    pi++;
}

//const pointer
void f2()
{
    int i = 100;
    int* const pi = &i;
    *pi = 200;
    //pi++; <- won't compile
}

//const pointer to a const
void f3()
{
    int i = 100;
    const int* const pi = &i;
    //*pi = 200; <- won't compile
    //pi++; <- won't compile

}

8 голосов
/ 18 сентября 2009

Вы должны попробовать cdecl:

~ $ cdecl
Type `help' or `?' for help
cdecl> explain <i>const char *someArray</i>
<b>declare someArray as pointer to const char</b>
cdecl> explain <i>char * const someArray</i>
<b>declare someArray as const pointer to char</b>
cdecl> explain <i>const char * const s2</i>
<b>declare s2 as const pointer to const char</b>
cdecl>
3 голосов
/ 18 сентября 2009
char * const array;

Это означает, что указатель является постоянным. Кроме того,

const * const char array;

означает постоянный указатель на постоянную память.

0 голосов
/ 19 сентября 2009

Повторение того, что написали другие пользователи, но я хочу предоставить контекст.

Возьмите эти два определения:

void f1(char *ptr) {
    /* f1 can change the contents of the array named ptr;
     * and it can change what ptr points to */
}
void f2(char * const ptr) {
    /* f2 can change the contents of the array named ptr;
     * but it cannot change what ptr points to */
}

Создание самого указателя const, как в примере с f2, абсолютно почти бессмысленно. Каждый параметр, переданный функции, передается по значению. Если функция изменяет это значение, она меняет только свою локальную копию и не влияет на вызывающий код.

/* ... calling code ... */
f1(buf);
f2(buf);

В любом случае buf не изменяется после вызова функции.


Рассмотрим функцию strcpy ()

char *strcpy(char *dest, const char *src);

Одна из возможных реализаций -

char *strcpy(char *dest, const char *src) {
    char *bk = dest;
    while (*src != '\0') {
        *dest++ = *src++;
    }
    *dest = *src;
    return bk;
}

Эта реализация меняет dest и src только внутри функции. Создание одного из указателей (или обоих) const ничего не даст для функции strcpy () или для вызывающего кода.

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