для одномерного массива, который вы можете просто использовать:
arr1.sort().toString() == arr2.sort().toString()
, это также позаботится о массиве с несогласованным индексом.
Ваш коллега неправ. Это - (неконстанта) указатель на (неконстанта) указатель на константу MyStructure. И в C и в C++.
В таких случаях инструмент cdecl (или C++ decl) может быть полезным:
[flolo@titan ~]$ cdecl explain "const struct s** ppMyStruct"
declare ppMyStruct as pointer to pointer to const struct s
Вы были правы в своей интерпретации. Вот другой способ посмотреть на него:
const MyStructure * *ppMyStruct; // ptr --> ptr --> const MyStructure
MyStructure *const *ppMyStruct; // ptr --> const ptr --> MyStructure
MyStructure * *const ppMyStruct; // const ptr --> ptr --> MyStructure
Это все альтернативы для от указателя к указателю с одним спецификатором константы. Справа налево правило может использоваться для дешифровки объявлений (по крайней мере, в C++; я не эксперт C).
Вы правы.
Другой ответ уже указал" По часовой стрелке Правило На спирали". Мне понравился тот очень - немного уточняют, все же.
Как заключение к другим комментариям, не помещайте 'константу' сначала. Это действительно принадлежит после типа. Это сразу разъяснило бы значение, просто считайте его RTL, как обычно:
MyStructure const** ppMyStruct;
Ваш коллега неправ, и это - то же для C и C++. Попробуйте следующее:
typedef struct foo_t {
int i;
} foo_t;
int main()
{
foo_t f = {123};
const foo_t *p = &f;
const foo_t **pp = &p;
printf("f.i = %d\n", (*pp)->i);
(*pp)->i = 888; // error
p->i = 999; // error
}
Visual C++ 2008 дает следующие ошибки для последних двух строк:
error C2166: l-value specifies const object
error C2166: l-value specifies const object
GCC 4 говорит:
error: assignment of read-only location '**pp'
error: assignment of read-only location '*p'
G ++ 4 говорит:
error: assignment of data-member 'foo_t::i' in read-only structure
error: assignment of data-member 'foo_t::i' in read-only structure
void Foo( int * ptr,
int const * ptrToConst,
int * const constPtr,
int const * const constPtrToConst )
{
*ptr = 0; // OK: modifies the pointee
ptr = 0; // OK: modifies the pointer
*ptrToConst = 0; // Error! Cannot modify the pointee
ptrToConst = 0; // OK: modifies the pointer
*constPtr = 0; // OK: modifies the pointee
constPtr = 0; // Error! Cannot modify the pointer
*constPtrToConst = 0; // Error! Cannot modify the pointee
constPtrToConst = 0; // Error! Cannot modify the pointer
}