2014-01-29 3 views
-1

Я нашел const правил в c, чтобы быть очень запутанным. Я хочу знать, существуют ли известные правила или способ узнать, что разрешено при работе с const/указателями на const.Правила const: что разрешено, а что нет?

я дам exmple:

Не допускается:

const int b=3; 

int * const a=&b; 

Разрешенные:

int b=3; 

int * const a=&b; 

Существуют ли правила, чтобы знать до компиляции, если код, который содержит const компилируется? Одна вещь, о которой я говорю, - и я хочу знать, является ли это правилом - каждый раз, когда вы пишете строку с const, всегда ли нужно ее инициализировать? Я знаю, что существует некоторое правило о том, что const может/не может содержать.

+0

В чем проблема? Вы можете преобразовать 'T *' в 'U *' iff 'U' - это равная или более CV-квалифицированная версия' T'. –

+1

-1. Вы можете разумно ожидать, что правильно произнесите единственное важное слово в своем вопросе. – djechlin

+0

'int * const' является постоянным указателем на переменную int, вы, похоже, ищете переменную указателя на константу int (' const int * 'или' int const * ') или указатель константы на константу int ('const int * const'). – Kevin

ответ

1

Первый пример:

const int b=3; 
// int * const a=&b; ERROR: cannot cast "const int *" to "int *". 
const int *const a = &b; 

Вы должны разворачивать декларацию.

  • Тип int *const является константным указателем на изменяемый int.
  • Тип const int * является изменяемым указателем на константу int.
  • Тип const int *const является постоянным указателем на константу int.

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

int *x = ...; 
x = ...; // ok, RHS must be int * 
*x = ...; // ok, RHS must be int 

int *const x = ...; 
x = ...; // error 
*x = ...; // ok, RHS must be int 

const int *x = ...; 
x = ...; // ok, RHS may be int * or const int * 
*x = ...; // error 

const int *const x = ...; 
x = ...; // error 
*x = ...; // error 
1

Основные правила таковы:

  • Это нормально, чтобы добавить const (при литье или иным образом преобразования).
  • Это хорошо, чтобы удалить constтолько если это const, который был добавлен позже, а не const, что объект был первоначально определен с.

Примеры:

int a = 3; 
const int b = 4; 

// Okay, adds const (says the int is const). 
const int *p0 = (const int *) &a; 

// Okay, adds const (says the pointer to the int is const). 
int * const p1 = (int * const) &a; 

// Okay, removes an added const. 
int *p2 = (int *) p0; 

// Not okay, removes a defined const. 
int *p3 = (int *) &b; 
2

Ваша проблема не является на самом деле с const сам, он с не в состоянии понять, что держать переменные.

Объявление чего-то const означает, что значение не будет изменено. Итак:

const int b=3; 

Теперь b держит 3, и вы не можете назначить ему что-то другое, потому что это константа.То же самое справедливо и для указателей:

int b=3; 
int * const a=&b; 

указатель a теперь указывает на адрес b, вы не можете назначить другой адрес туда. Причина, по которой это:

const int b=3; 
int * const a=&b; 

не работает потому, что a является постоянным указателем на (непостоянный) int. Тем не менее вы пытаетесь присвоить значение a значение константы int. Поэтому компилятор говорит «нет».

const int b=3; 
const int * a=&b; 

Это изменение теперь позволяет ему работать, потому что a является указателем на постоянная междунар, что и b есть, так что это нормально, чтобы сделать задание. Если вы хотите как a и b постоянных вам нужно сделать вторую строку:

const int * const a=&b; 

Вы бежите в проблему с spiral rule.

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