присвоение указателя на константный символ - PullRequest
6 голосов
/ 12 октября 2011

Действительны ли следующие назначения?Или любой из них создаст проблемы.Пожалуйста, предложите.

const char * c1;  
const char * c2; 
const char * c3;
char * c4;

c2 = c1;
c2 = c3;
c2 = c4;

Что если я сделаю следующее, это нормально?

const char * c5 = "xyz";
char * c6 = "abc";

c2 = c5;
c2 = c6;

Ответы [ 4 ]

31 голосов
/ 12 октября 2011

В своем уме проведите линию через звездочку.Слева находится то, на что указывает указатель, а справа - тип указателя

Например,

  1. const char * const p - указатель p является постоянным, как и символычто p указывает на - т.е. не может изменить и указатель, и содержимое на то, что p указывает на
  2. const char * p - p указывает на постоянные символы.Вы можете изменить значение p и заставить его указывать на разные постоянные символы.Но что бы ни указывало p, вы не можете изменить содержимое.
  3. char * const p - Вы не можете изменить указатель, но можете изменить содержимое

и, наконец,

  1. char * p - все готово для захвата

Надеюсь, что поможет.

9 голосов
/ 12 октября 2011

Все являются действительными утверждениями, так как вы не разыменовываете их, потому что все указатели остаются неинициализированными или не указывают ни на какие допустимые области памяти.

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

3 голосов
/ 12 октября 2011

Все эти задания совершенно верны, как я и другие объяснили в вашем недавнем наборе почти идентичных вопросов.

A const char* - указатель на память, который нельзя изменить с помощью этого указателя.Ничто здесь не может обойти это.Компилятор будет возражать, если вы назначите c4 = c1 с тех пор, что обойдёт константу.

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

Все они действительны, единственная проблемная строка - char * c6 = "abc";: здесь «abc» является константным литералом, поэтому его присвоение неконстантному указателю небезопасно и должно по крайней мере генерировать предупреждение, если не происходит компиляция ошибка (я не пытался ее скомпилировать).

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