использование константы с указателями в C

Я подозреваю, что это - случай, "не добавляет ничто к языку, если это действительно не увеличивает стоимость" - и это рассматривалось как добавляющий достаточно мало значения для не ценности того. Как Вы сказали, легко двигаться, и откровенно это редко необходимо так или иначе (только для разрешения неоднозначности).

то же верно в C#, и я особенно никогда не пропускал его ни на одном языке. То, что я действительно пропускаю в Java, является неподписанным типом байта:)

18
задан Cel Skeggs 28 April 2015 в 15:49
поделиться

6 ответов

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

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

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

47
ответ дан 30 November 2019 в 05:40
поделиться
//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

}

13
ответ дан 30 November 2019 в 05:40
поделиться

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

~ $ cdecl
Type `help' or `?' for help
cdecl> explain const char *someArray
declare someArray as pointer to const char
cdecl> explain char * const someArray
declare someArray as const pointer to char
cdecl> explain const char * const s2
declare s2 as const pointer to const char
cdecl>
8
ответ дан 30 November 2019 в 05:40
поделиться
char * const array;

Это означает, что указатель постоянный. Также

const * const char array;

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

3
ответ дан 30 November 2019 в 05:40
поделиться

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

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

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 ( ) function

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 (), ни для вызывающего кода.

0
ответ дан 30 November 2019 в 05:40
поделиться

Создайте видеопрезентацию, представляющую сайт прототипа. Убедитесь, что громкость очень низкая (так как она на слишком большом количестве видео), поэтому он должен включить громкость, чтобы услышать ее. В конце презентации, дайте URL на сайт прототипа, чтобы он мог опробовать его для себя, нормальный громкость (теперь взрывной так как он свернул громкость) аудио включены.

-121--2359706-

если вы находитесь в окне, отредактируйте файл\windows\system32\drivers\etc\hosts и добавьте следующую строку:

127.0.0.1  username.mysite.com

, затем, когда сервер работает, вы можете открыть браузер и набрать:

http://username.mysite.com
http://username.mysite.com:8080

или что угодно и посмотреть веб-сайт.

Для этого потребуются права администратора.

Если вы находитесь в linux, вам потребуется отредактировать/etc/hosts и сделать то же самое.

Однако при развертывании необходимо настроить веб-сервер и DNS-сервер. так что, если вы хотите получить полный опыт, вы должны установить DNS-сервер локально и использовать его в качестве вашего nameserver сетей. это более сложная задача, и инструкции зависят от того, находитесь ли вы на linux или windows, и какой веб-сервер вы используете.

Затем вы должны написать немного кода в вашем приложении, чтобы проверить переменные сервера, чтобы выяснить, какой поддомен был использован, и выполнить обработку на основе этого.

-121--2991126-

Из какова разница между const int *, const int * const, int const * :

Читать назад...

 int * - указатель на int
int const * - указатель на const int
int * const - указатель на int
int const * const - указатель на const int
17
ответ дан 30 November 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: