2013-03-01 2 views
7

В чем разница между следующими тремя декларациями указателей в C:Положения константного ключевого слова

void * const myPointer1; 
void const *myPointer2; 
const void *myPointer3; 

и который один используются для предотвращения:

myPointer = somethingElse; 
+6

Не говорите мне, что вы пытались исследовать его, и вы ничего не нашли. – LihO

+0

Не пропустите 'const void * const myPointer;' :) – elmigranto

+0

@LihO Я не нашел ничего, что было бы чисто C (не C++ или ObjC), и это было для простых типов указателей без смешивания в функциях. – lms

ответ

7

Прочитайте правила справа налево:

void * const myPointer1; 

myPointer1 является const указатель на void.

void const *myPointer2; 

myPointer2 является указателем на constvoid.

const void *myPointer3; 

myPointer3 является указателем на voidconst.

Выводы:

  • myPointer1 является то, что вы ищете - это const указатель, поэтому его значение не может быть изменено
  • myPointer2 и myPointer3 одно и то же
  • myPointer2 и myPointer3 добры от бессмысленного разыменования a void* не имеет смысла
0
  • myPointer1 является const указателем на void ,
  • mypointer2 и myPointer3 оба указателя на const void.

Различия между объявлениями myPointer2 и myPointer3 - это только вопрос стиля.

NB: const void означает, что указанные данные const. Нет ничего общего с void от int main(void), например.

+0

Что будет означать тип 'void' (или' const void', если на то пошло)? Например, что может быть присвоено адресу, указанному таким указателем ('* mypointer2 =?') – SomeWittyUsername

+0

@icepack: «void *» является «общим указателем», то есть «указателем на все». Вы присвоили бы ему другое значение указателя, например 'mypointer = otherpointer'. Тем не менее вы не назначали значение указателю * разыменованного *. – DevSolar

+0

@DevSolar Да, я знаю об этом. Мне было интересно о семантическом значении «указатель на пустоту». Мне кажется, что такое описание логически неверно. 'void' здесь является псевдонимом для« ничего »в отличие от обычного значения« void ». – SomeWittyUsername

1

В некоторых местах, вы можете поставить const перед любой объявлен const:

const int * x; // pointer to constant int 

Вы можете всегда поставить constпосле независимо объявлен сопзЬ:

int const * x;  // pointer to constant int 
int * const x;  // constant pointer to int 
int const * const x; // constant pointer to constant int 

Следовательно, мои личные рекомендации, всегда имеют const, потому что это единственное «правило», которое можно придерживаться последовательно.

0
  1. void * const myPointer1; = объявить myPointer1, как константный указатель к мочеиспусканию
  2. void const *myPointer2; = объявить myPointer3, как указатель к мочеиспусканию Const
  3. const void *myPointer3; = объявить myPointer3, как указатель на константные аннулируются

Всякий раз в таких сомнительных сомнениях вы можете использовать: cdecl.org

Вы должны попробовать myPointer1, чтобы избежать условия, которые вы объяснили, так как это const pointer.

+0

BTW. http://cdecl.org/ не поддерживает «void const * myPointer2;». Вот почему я приземлился на этой странице, по поиску в Google, чтобы подтвердить то, что я вспомнил, таким образом 2 так же, как 3. – domen

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