назначения указателя const char

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

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;

person user32262    schedule 12.10.2011    source источник
comment
@ Kshitij Mehta - не домашнее задание, мы сталкиваемся с проблемой памяти с нашей обширной кодовой базой. Поэтому, пожалуйста, любая помощь будет оценена по достоинству.   -  person user32262    schedule 12.10.2011
comment
@user Вы уже несколько раз задавали один и тот же вопрос. Мы отвечали на них снова и снова. Ваше редактирование этого вопроса ничего не добавляет. Это просто повторяет то, что вы спросили выше.   -  person David Heffernan    schedule 12.10.2011
comment
Прошу прощения, если спрашиваю о том же. Может быть, мое понимание указателей неточно.   -  person user32262    schedule 12.10.2011
comment
Возможно, вы могли бы попытаться объяснить то, что вы изо всех сил пытаетесь понять. Я думаю, вам нужно попробовать что-то другое, потому что этот вопрос будет получать один и тот же ответ каждый раз, когда вы его задаете! ;-) Попробуйте выразить себя другим способом, отличным от того, что вы делали до сих пор.   -  person David Heffernan    schedule 12.10.2011


Ответы (4)


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

Например

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

и наконец

  1. char * p - Все готово

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

person Ed Heal    schedule 12.10.2011
comment
Вы имеете в виду 2 * в первом примере? - person Martin Thompson; 12.10.2011
comment
Очень ясно. Хороший пост. Я просто искал, задаваясь вопросом, почему я могу изменить const char* ptr в качестве входного аргумента, и это прекрасно прояснилось. У меня нет голосов еще 40 минут, так что после этого я поставлю ++. - person stevieb; 30.06.2017
comment
без этого ответа я бы никогда не понял разницу между 2 и 3. - person Joey Liu; 11.11.2020

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

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

person Mahesh    schedule 12.10.2011

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

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

person David Heffernan    schedule 12.10.2011

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

person hege    schedule 12.10.2011