2016-06-09 2 views
-2

В чем разница между следующими:Указатели, константы и тип aliasis

const char *c = 0; //Here c is a pointer to a constant character 

typedef char *pstring; 
const pstring cstr = 0 //cstr is a constant pointer to a character 

Почему существует разница между этими двумя заявлениями, в то время как они смотрят только same.In C++ Primer упоминается, что основание тип первого оператора - const char, а * - часть объявления. Хотя для последнего оператора базовый тип - const pstring. Я не понимаю разницу между ними.

+0

Pstring является указателем на char, поэтому const pstring является указателем const на символ. – immibis

ответ

0
const char *c = 0; 

Объявляет c быть указателем на const char. Вы не можете изменить то, что c указывает на c. Однако c может указывать на другую строку.

char arr[] = "test"; 
c = arr; // OK 

С другой стороны.

typedef char *pstring; 
const pstring cstr = 0; 

объявляет cstr быть const указатель на char. Вы можете изменить то, что cstr указывает, но вы не можете изменить, где cstr указывает на. Без typedef, вы будете использовать:

char* const cstr = 0; 

К сожалению, язык позволяет const быть место до основного типа. Будет намного понятнее использовать:

char const* c = 0;  // what c points to is const 

Прочитано справа налево. c является указателем на constchar.

char* const cstr = 0; // the pointer is const 

Читайте справа налево. c является указателем const на char.

IMO, const -ness указателя и объекта, который он указывает, является более четким с вышесказанным.

+0

Я знаю разницу между постоянным указателем и указателем на постоянный символ. Проблема в том, что мы используем : typedef int num, тогда каждое появление int заменяется на num. Итак, если мы напишем typedef char * pstring, то выражение const pstring будет const char * (я только что заменил pstring на char *, что здесь не так) –

+0

@NamanSharma *, то каждое появление int заменяется на num. * вид истины. Это не похоже на макроподстановку. –

+0

Итак, что вы хотите сказать, мы фактически не заменяем, это всего лишь способ написать. Но это смущает в случае указателей. –

1

Чтение деклараций указателей справа налево помогает понять их.

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

Второй является указателем const на символ. Вы не можете изменить значение указателя (местоположение символа, на которое он указывает), поскольку указатель является константой.

Следить typedef char* pstring (и это хорошая идея, чтобы переместить звездочку от вашего TypeName, поскольку это не является его частью), то константность применяется к типу, который он создает, как это делает все остальное:

int i; 
const int i = 0; // actually int const i = 0 

char* p; 
const char* p = 0; // actually char const* p = 0 

typedef char* pstring; 
const pstring ps = 0; // actually 'pstring const' -> 'char* const' ps = 0 

Именно по этой причине, некоторые стандарты кодирования (например, Мишр) требуют, чтобы вы разместить отборочные резюме после имени типа, потому что он работает лучше, чтобы показать, что сопзЬ-ность квалифицирует тип, это зависит от него - а не наоборот.

+0

Получил. Благодаря! –

+0

@NamanSharma приветствуется. :) Если вы сочтете это полезным, пожалуйста, подумайте о том, чтобы продолжить или принять. Спасибо! – zyndor

3

Я думаю, что ваше замешательство связано с тем, что он не знает о верхнем уровне const. Когда у вас есть typedef, вы не можете добавить const в базовый тип, только над ним.

const pstring p не совпадает с const char *p i.e. typedef s не являются макрозаменами. После typedef ed тип атомный; не имеет значения, где находится const, будь то слева или справа от типа, связанного с полным типом, в данном случае char*.

typedef char* pstring; 
const pstring p1; // const pointer to char i.e. char* const 
pstring const p2; // const pointer to char i.e. char* const 

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

const char* p1; // pointer to const char 
char* const p2; // const pointer to char 

What are top-level const qualifiers? Подробнее читайте.

Смежные вопросы