модификация указателя на константный символ - PullRequest
1 голос
/ 11 октября 2011

Можем ли мы присвоить одно const char * другому и изменить значение?

const char * c1; 
const char * c2 = c1; 

Является ли указанное выше назначение допустимым?

Ответы [ 4 ]

2 голосов
/ 11 октября 2011

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

Итак, да, приведенное выше задание совершенно правильно.


Интересно, относится ли этот вопрос к вашему предыдущему вопросу . Вы говорите здесь:

Можем ли мы присвоить одно const char * другому и изменить значение?

Если под «изменить значение» вы подразумеваете изменение содержимого строки (это то, что вы хотели сделать в предыдущем вопросе), то нет, вы не можете. В приведенном здесь примере у вас есть два указателя на один и тот же постоянный блок памяти. Если один из указателей не может изменить эту память, то и другой не может.

1 голос
/ 11 октября 2011

const char* означает, что указанная строка является постоянной.

char const* означает, что сам указатель является постоянной.

0 голосов
/ 11 октября 2011

Вы уже знаете это, но стоит повторить: квалификатор const является директивой только для компилятора . Это не имеет ничего общего с тем, что вы чувствуете, когда делаете в время выполнения . Смысл const звучит так: «Эй, мистер компилятор: говорите мне всякий раз, когда вы замечаете, что я изменяю эту переменную так, как я не хотел». AFAIK, компилятор выдает предупреждение, когда видит такое саморазрушительное использование. Я полагаю, что в этом случае вы могли бы заставить компилятор выдать ошибку.

0 голосов
/ 11 октября 2011

Да, это совершенно верно.

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

Это дает вам два указателя, указывающие на одну и ту же область памяти.

    |----------|                                 
    |   c1     |                            
    |          |  1000                       
    |   2000   |                             
    |----------|                               
          |                                           
          |
          |
          |
          -------------------->|----------|
                               |   num    |
          -------------------->|          |  2000
          |                    |    2     |     
          |                    |----------|
          |
          |
    |----------|                             
    |   c2     |                            
    |          |  3000                       
    |   2000   |                             
    |----------|    

Вы можете взломать и изменить содержимое указателя const char *, но обратите внимание, что изменение переменной, объявленной как const, приводитв Неопределенное поведение .

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