Указатели, константы и псевдоним типа

В чем разница между следующим:

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

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

-1

Решение

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

const pstring p это не то же самое, что const char *p то есть typedefs не являются макро-заменами. однажды typedefтип атомарный; не имеет значения, где const будь то слева или справа от типа constNess ассоциируется с полным типом, в данном случае 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

Что такое const-квалификаторы верхнего уровня? Читайте, чтобы узнать больше.

3

Другие решения

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

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

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

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

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

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

2

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 это указатель на const char,

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

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

ИМО, const-очность указателя и объекта, на который он указывает, яснее с вышеизложенным.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector