2015-12-09 4 views
3

У меня есть метод, который, имеющий следующую подпись:голец сопзЬ * сопзЬ * сопзЬ имяПерем

size_t advanceToNextRuleEntryRelatedIndex(size_t index, size_t nStrings, char const *const *const strings) 

Как интерпретировать это: char const *const *const strings?.

Thanks, Pavan.

+3

справа налево, строк постоянный указатель, указывающий на постоянный указатель, ссылающийся на константные набор символов? – Arunmu

+1

Проводили ли вы какое-либо исследование того, как формируются декларации C? – Angew

+2

@Pavan Вероятно, вы должны начать с этого. http://stackoverflow.com/questions/4949254/const-char-const-versus-const-char – Arunmu

ответ

2

В char const *const *const strings, strings является указателем на указатель char. Без const отборочного это будет выглядеть следующим образом:

char **strings; 

В const отборочных запретить модификацию разыменованного значения на определенном уровне разыменования:

**strings = (char) something1; // not allowed because of the first const 
*strings = (char *) something2; // not allowed because of the second const 
strings = (char **) something3; // not allowed because of the third const 

Других слова, третий Const говорит, что указатель сам неизменен, второй const говорит, что указательный указатель неизменен, а первый говорит, что указательный символ неизменен.

1

Ключевое слово const делает объявление после этого ключевого слова константой. код объясняет лучше, чем слова:

/////// Test-code. Place anywhere in global space in C/C++ code, step with debugger 
char a1[] = "test1"; 
char a2[] = "test2"; 

char *data[2] = {a1,a2}; 

// Nothing const, change letters in words, replace words, re-point to other block of words 
char **string = &data[0]; 

// Can't change letters in words, but replace words, re-point to other block of words 
const char **string1 = (const char **) &data[0]; 
// Can neither change letters in words, not replace words, but re-point to other block of words 
const char * const* string2 = (const char * const*) &data[0]; 
// Can change nothing, however I don't understand the meaning of the 2nd const 
const char const* const* const string3 = (const char const* const* const) &data[0]; 


int foo() 
{ 

    // data in debugger is:    {"test1","test2"} 
    **string = 'T';   //data is now {"Test1","test2"} 
    //1 **string1 = 'T'; //Compiler error: you cannot assign to a variable that is const (VS2008) 
    *string1=a2;   //data is now {"test2","test2"} 
    //2 **string2='T';  //Compiler error: you cannot assign to a variable that is const (VS2008) 
    //3 *string2=a2;  //Compiler error: you cannot assign to a variable that is const (VS2008) 
    string2=string1; 

    //4 **string3='T';  //Compiler error: you cannot assign to a variable that is const (VS2008) 
    //5 *string3=a2;  //Compiler error: you cannot assign to a variable that is const (VS2008) 
    //6 string3=string1; //Compiler error: you cannot assign to a variable that is const (VS2008) 
    return 0; 
} 

static int dummy = foo(); 

/////// END OF Test-code 
+0

На самом деле я хотел отменить этот ответ, но теперь я не могу, потому что прошло 5 минут. Это говорит «после этого ключевого слова», когда на самом деле это «раньше». Даже этот пример говорит об этом: – Roman

+0

// Невозможно изменить буквы в словах, а не заменять слова, но повторно указывать на другой блок слов const char * const * string2 = (const char * const *) & data [0]; – Roman

2
char const *const *const strings 
^ v ^v ^v 
| | | | | | 
+----- +--+ +--+ 

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

например.

char* p{"string1","string2"}; 

, который будет распадаться на гольца **

при передаче

int n = 0; 
advanceToNextRuleEntryRelatedIndex(n, 2, p); 
+0

const ссылается на объявление, которое следует за константой, а не предшествующей. –

+2

@ValentinHeinitz Это неверно. 'const' относится к типу слева. Только в специальном случае, когда слева от 'const' нет ничего,' const' будет ссылаться на тип справа. 'int const * p' является неконстантным указателем на постоянное целое число. 'const int * p' - то же самое. 'const int const * p' имеет один избыточный' const'. 'int * const p' - постоянный указатель на непостоянное целое число. См. [Соглашения C & C++ для const] (https://en.wikipedia.org/wiki/Const_%28computer_programming%29). Это легко для misundestand 'const', когда' const int' и 'int const' являются действительными. – sendaran

+0

@sendaran да, по этой причине я прекратил использовать const на левой стороне, когда это возможно, я считаю, что он более последователен и отлично работает с typedefs –

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